概要
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())
- 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()を代入しなければうまくいかないと思います.