cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

日本語プロットの文字化けストレスを低減する - RStudio v1.4とraggパッケージを使う

RStudio v1.4とraggパッケージの登場でRStudio上で日本語の作図が面倒な指定不要で行えるようになりました。記事中で紹介する方法をとれば、RStudioのPlotsパネルに出力する図が文字化けしなくなります。RStudioユーザで日本語での作図を行う方にはぜひ知っていてもらいたいtipsです。

なお、この記事の元ネタは https://www.tidyverse.org/blog/2021/02/modern-text-features/ で紹介されている通りです。詳細を知りたい方はぜひこちらのページや文末の参照ページ掲載のリンクをください。

RStudioと文字化け

みなさん大好きなRStudio、開発チームが頑張っていて、日本語を含めた多言語対応が進んでいます。一方で、日本語ユーザである我々にとっては、痒いところに手が届いていないと感じる部分や使い勝手の不自由さを感じる面もあります。具体的には「文字入力」と「文字化け」、これら2つの事柄はRStudioで日本語などのマルチバイト文字列を利用する際に問題となりやすい印象にあります。

文字化けは作図を行う際に生じます。何も考えずに次のコードをRStudioで実行すると、Plotsパネルに表示されるプロットにはmain引数に指定した文字列が正しく出力されず、いわゆるトーフ状態となります。

plot(mtcars$mpg, 
     mtcars$disp, 
     main = "排気量と燃費の関係")

f:id:u_ribo:20210329174110p:plain
RStudioでの日本語プロットの文字化け

これはR標準のグラフィックス機能の他、可視化パッケージとして有名なggplot2でも生じます(結果の出力は省略します)。

library(ggplot2)
p <- 
  ggplot(mtcars, aes(mpg, disp)) +
  geom_point() +
  labs(title = "排気量と燃費の関係")
p

解決策はいずれも出力時に日本語の書体を指定することです。ここではmacOSで利用可能な日本語フォントの一種、「ヒラギノ明朝」のウェイトバリエーション「W3」を指すHiraginoSans-W3で日本語文字列を表示するようにプロットする例を示します。

par(family = "HiraginoSans-W3")
plot(mtcars$mpg, 
     mtcars$disp, 
     main = "排気量と燃費の関係")

p +
  theme_gray(base_family = "HiraginoSans-W3")

f:id:u_ribo:20210329174828p:plain

簡単なコードを追加するだけですが、毎回やるのは面倒です。またggplot2では既定の書体をtheme_set()を利用して次のように設定可能ですが、できればこの設定を意識せずに使えると楽ですよね。

こうして我々が悩まされてきた文字化けの問題がRStudioのバージョン1.4とraggパッケージによって改善される、というのが本題です。RStudio v1.4は2021年3月時点での最新版です。こちらからダウンロード可能です。また、raggはRパッケージを管理するCRANに登録されており、install.packages("ragg")を実行するとインストールされます。それでは実際にRStduio v1.4とraggを使って楽に日本語プロットを行うようにする設定を見ていきましょう。

RStudio v1.4とraggパッケージの組み合わせで文字化けを回避

RStudio v1.4とraggパッケージの用意は済んでいますか?両方が揃ったら(raggの追加は後でも可能なので、最低限RStudioを導入してください)、RStudioの環境設定(Preferences)、General、Graphicsの中のGraphic DeviceBackendの項目からAGGを適用するだけです。AGG(Anti-Grain Geometry)はraggパッケージが実装する作図デバイスのバックエンド処理で、この指定により日本語の文字化けが解消されます。一度設定すれば、RStduioを再起動しても設定は引き継がれます

以下、細かい手順を解説します。RStudioの環境設定(Preferences)を開きます。環境設定を開くと、左側にGeneral、Code、Appearanceと並ぶ画面が表示されます。画面が表示された時の位置がGeneralです。そのまま右側のボックスに目を向けましょう。こちらにはBasic、Graphics、Advancedのタブがあり、現在はBasicの設定内容が表示されていると思います。ここでGraphicsのボタンをクリックして作図に関する設定を変更します。Graphic DeviceBackendの項目が選択可能になっていますので、ここでAGGを選び、Applyボタンをクリック、OKボタンによって設定を反映させましょう。この時、もしraggパッケージがインストールされていない状態であれば、インストールを促すポップアップが表示されるので、まだの場合はここで行ってください。設定はこれだけです。

f:id:u_ribo:20210329175124p:plain

AGGを適用させたら、もう一度日本語のプロットを行ってみましょう。今度は文字化けせずに正しく日本語文字列が表示されているはずです。

注意点

上記の設定はあくまでRStduio上での作図(スクリーン上での表示)に機能します。そのため、ファイルやR Markdownでの出力の際には従来通りフォントの指定を行わないと文字化けします。ですので出力デバイスの指定にraggパッケージが提供する agg_*()の利用や、チャンクオプションでdev='ragg_png'を与えることをお勧めします。

ファイルへの出力

まずは標準の保存方法を示します。以下のコードで出力される図は日本語の文字化けがみられます。

# 日本語フォントの指定をしていないため、出力されたファイルで文字化けしている
png("out.png")
plot(mtcars$mpg, 
     mtcars$disp, 
     main = "排気量と燃費の関係")
dev.off()

AGGを利用してpng形式で保存する際はragg::agg_png()を使います。ファイル名やサイズ、解像度などの指定は基本的にはpng()と同じです。

# 日本語フォントの指定不要で文字化けしない
ragg::agg_png("out.png")
plot(mtcars$mpg, 
     mtcars$disp, 
     main = "排気量と燃費の関係")
dev.off()

ggplot2ベースでの保存、すなわちggsave()を使う場合にはさらに注意が必要です。デバイス指定の引数deviceragg::agg_pngを与えた時に出力サイズが小さくなってしまう問題が報告されています

github.com

これを防ぐためにheightwidthのオプションで出力サイズを大きくしようとすると次のエラーになります。

ggsave(plot = p, 
       filename = "out.png", 
       device = ragg::agg_png,
       height = 100
       width = 100)
#> Error:   Dimensions exceed 50 inches (height and width are specified in 'in' not pixels).
#>  If you're sure you want a plot that big, use `limitsize = FALSE`.

この場合エラーメッセージの案内に従いlimitsize = FALSEを使いましょう。

もう一点、device=ragg::agg_pngを指定すると解像度のためのオプションggsave(dpi = )は機能せず、ragg::agg_png(res = )の値が適用されます。ですが次のようにしてggsave()の中で直接ragg::agg_png(res = )の値を操作可能です。

ggsave(plot = p, 
       filename = "out.png",
       device = ragg::agg_png,
       # dpi = 320の代わりに指定
       res = 320,
       height = 2240, # pixelsでのサイズ
       width = 2240,  # pixelsでのサイズ
       limitsize = FALSE)

このあたりの処理はちょっとややこしいですが、問題解消のための機能改善が進んでいるようなので期待しましょう。

R Markdownでの利用

R Markdownでraggの機能を利用には、

  1. 図を出力するチャンクオプションにdev='ragg_png'を指定する
  2. knitr::opts_chunk(dev = "ragg_png")を設定する
  3. YAMLヘッダ部分にdev: "ragg_png"を加える

のいずれかの方法をとります。チャンクオプションdev='ragg_png'を追加する場合は以下のようになります。

 ```{r, eval=FALSE, dev='ragg_png'}
# 文字化けしない
plot(mtcars$mpg, 
     mtcars$disp, 
     main = "排気量と燃費の関係")
 ```

参考ページ