Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

概要

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

mytk0u0
ほぼ全ての記事を手探りで得た知見の共有として書いています。間違っていたり非効率だったりするものもあるかと思います。その場合はご指摘いただけると嬉しいです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away