📖

R Markdownでのggplot2の日本語プロットをAGGをバックエンドに使いつつインライン表示する

2021/09/29に公開

やりたいこと

macOS(Big Sur 11.5.2)上の執筆時最新版RStudio(2021.09.0)でR Notebookを書いているとして、BackendのGraphics DeviceにAGGを指定しつつ、ggplot2パッケージを使って日本語を含む図を(plotペインではなく)インラインで表示したい。

問題

文字化けする。たとえば以下のようなシンプルなコードでも、

library(tidyverse)
iris |> 
  mutate(label = rep("花", nrow(iris))) |> 
  ggplot( aes(Sepal.Length, Sepal.Width, label = label)) +
  geom_text(family = "YuMincho") 

エラーは

Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y,  :
  no font could be found for family "YuMincho"

とでる。

geom_text()でフォントを指定しなければ当然動くが豆腐

library(tidyverse)
iris |> 
  mutate(label = rep("花", nrow(iris))) |> 
  ggplot( aes(Sepal.Length, Sepal.Width, label = label)) +
  geom_text() 

fontregistererを使う

github repoを参考に、{remotes}を入れて、

remotes::install_github("Gedevan-Aleksizde/fontregisterer", upgrade = "never")

してからlibrary(fontregisterer)すると、

少なくともgeom_text()部分はうまくいく。軸名などに日本語を使おうとすると、

library(tidyverse)
library(fontregisterer)
iris |> 
  mutate(label = rep("花", nrow(iris))) |> 
  ggplot(aes(Sepal.Length, Sepal.Width, label = label)) +
  geom_text(family = "YuMincho") +
  labs(title = "あああ", x = "いいい", y = "ううう")


うまくいかないので、それはtheme_grey(base_family= "")で指定するか、

theme_set()で一括で登録する:

library(tidyverse)
library(fontregisterer)
theme_set(theme(text = element_text(family = "YuGothic")))
iris |> 
  mutate(label = rep("花", nrow(iris))) |> 
  ggplot(aes(Sepal.Length, Sepal.Width, label = label)) +
  geom_text(family = "YuMincho") +
  labs(title = "あああ", x = "いいい", y = "ううう")

ここで横着して、geom_text()にも適用されるやろと思うと豆腐が帰ってくる:

library(tidyverse)
library(fontregisterer)
theme_set(theme(text = element_text(family = "YuGothic")))
iris |> 
  mutate(label = rep("花", nrow(iris))) |> 
  ggplot(aes(Sepal.Length, Sepal.Width, label = label)) +
  geom_text() +
  labs(title = "あああ", x = "いいい", y = "ううう")

これは仕様らしいです

library(ragg)をいれてもきちんと動く

が、正直なところ、差がわかるようなプロットではないため、raggがちゃんとあたっているのかあたっていないのかすら判断できない。なにか間違えてるかも:

library(tidyverse)
library(fontregisterer)
library(ragg)
knitr::opts_chunk$set(dev = "ragg_png")
theme_set(theme(text = element_text(family = "YuGothic")))
iris |> 
  mutate(label = rep("花", nrow(iris))) |> 
  ggplot(aes(Sepal.Length, Sepal.Width, label = label)) +
  geom_text(family = "YuMincho") +
  labs(title = "あああ", x = "いいい", y = "ううう")

おまけ、plot()もうまくいくようにできる

まだlibrary(fontregisterer)をロードしていない状態では次のようになる

plot(1, main = "あああ", xlab="いいい")


しかしpar()関数でYuGothicを指定してから、さらにこれら2行を同時に(cmd+shift+enterなどで)実行すると、エラーを吐き出しつつちょっとだけ日本語フォントを使える:

par(family="YuGothic")
plot(1, main = "あああ", xlab="いいい")

しかしticks(値の文字)などは表示されていない。しかも、なぜかYuMinchoを指定すると軸名なども表示されなくなる:

これもlibrary(fontregisterer)を使うとうまく表示されるようになる。ただしこれを用いてもこの2行を同時に走らせないといけないことにはかわりがない:

YuGothicでももちろんうまくいく:

なんでだろう…。これらの症状は2021.12.0のDaily buildでも同様でした。

おまけ、またpolygon edge not foundがでたら

RNotebookで、なぜか上記をすべてやっても動かなくなった場合。再起動しても治らない。まっさらなsessionで上記のミニマムなコードを.Rファイルで実行したら動くようになった。なぜ。

PDFで書き出す

ggsave(
  "./output/tmp.svg", 
  device = svglite::svglite, 
  unit = "mm",
  height = 30, 
  width = 70
)

rsvg::rsvg_pdf("output/tmp.svg", "output/plot.pdf")

謝辞

Tokyo.Rでill_identifiedさんに教えてもらってやっとできるようになった。ありがとうございます。

GitHubで編集を提案

Discussion