LoginSignup
9
8

More than 5 years have passed since last update.

macOSのJupyter + IRkernelで日本語プロット

Last updated at Posted at 2017-04-05

概要

macで,なるべく簡単に,日本語を含む図を作りたいと思った話です.
具体的には,_.pngみたいな名前でプロットを保存し呼び出す,という原始的な方法を取ります.

ちなみにRStudioであれば,

par(family = "HiraKakuProN-W3")

で問題なく日本語が使えるので,この記事のような対策をとる必要はありません.

※2017/04/29追記: ggplotに対応させました.

まえがき

Jupyter NotebookのRで日本語プロットするとフリーズするんだけど.

...という怒りに身を任せて作りました.

JupyterのR kernel使用時に日本語を含むグラフを描くという記事によれば,


#明示的にquartzデバイスを起動
#pngファイルに保存するようにtypeとfileを設定
quartz(type = "png", file = "test.png")
#font-familyをpar関数で指定
par(family = "HiraKakuProN-W3")
#plot関数で描画
plot(0,0, xlab = "日本語", ylab = "日本語")
#quartzデバイスを定位
dev.off()
次のセルをマークダウン形式にして画像を呼び出し

![testpng](test.png)

というコードで日本語プロットが可能とのこと.
これをベースに,日本語をプロットする関数を作っていきます.

完成したコード

P()でプロット関数を囲むと日本語を出力できる関数です.

P <- function (plot.order, width = 5, height = 5, filename = '_.png', dpi = 128,
               font.size = 12, font.family = "HiraKakuProN-W3", gg = FALSE) {
    if (gg == TRUE) {
        # themeは必要に応じて書き換える
        p <- plot.order + ggplot2::theme_gray(base_size = font.size, base_family = font.family)
        ggplot2::ggsave(file = filename, plot = p, width = width, height = height, dpi = dpi)
    } else {
        quartz(type = 'png', width = width, height = height, dpi = dpi, file = filename)
        old.par <- par(family = font.family, ps = font.size)
        p <- plot.order
        par(old.par)
        dev.off()
    }

    options(repr.plot.width = width, repr.plot.height = height)  # Jupyterを使わない場合は外す
    img <- png::readPNG(filename)
    grid::grid.raster(img)
}

SamplePlotFunction <- function() {
    plot(1:3, 1:3, xlab = '日本語', ylab = '入力', type = 'n')
    text(1:3, 1:3, c('あ', 'い', 'う'))
}

P(SamplePlotFunction())

20161207.png

  • ggplotを使う人はgg = Tで.この場合ggplotオブジェクトを直接突っ込んで大丈夫です.
  • フォントはお好みのものに変えてください.自分の場合はfont = "Ricty"font = "MyricaM"です.

あとがき

Rにデコレーターがなくて辛かったです.@JapanesePlotとかできたら綺麗なのにな.あと,

foo <- SamplePlotFunction()
P(foo)

だとうまくいかないです.fooを作った時点で作図されるので (ただしggplotはP(gp, gg = T)してもOK)
今回の方法はRが遅延評価の言語であることを利用しているので,plot.orderに直接SamplePlotFunction()を代入しなければうまくいかないと思います.

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8