ggplot2のグラフに日本語を入れる

『Rグラフィックスクックブック 第2版』の追補Bに、グラフに日本語を入れる方法が記されている。しかし、PDFファイルに保存するまでの方法がなかったので、調べた。

PNGファイルならば普通にggsave()で対応できるが、PDFファイルになるとトラブルがでた。さらに調べると、『Rによる計量政治学』p.112に、該当する記述があった。

環境は:macOS 10.15.2、R 3.6.2、RStudio 1.2.5019、ggplot2 3.6.2、cowplot 1.0.0、patchwork 1.0.0

下のコードではcowplot(テーマだけ使った)、patchworkでのグラフの組合せを使っていないが、これらを使っても日本語が入った。

# Rグラフィックスクックブック 第2版 B.4

rm(list = ls()) # Environmentを初期化
if( dev.cur() > 1 ) dev.off() # Plotsを初期化
cat( "\014" ) # Consoleを初期化

# Cookbookで使うライブラリー
library(dplyr)
library(ggplot2)
library(gcookbook)
library(cowplot)

# フォントファミリーを定義する
# 4つのスタイルに同じフォントを使ってしまう場合
# quartzFonts(HiraKaku = quartzFont(rep("HiraginoSans-W3", 4)))
# ウエイトだけ使い分ける場合
# quartzFonts(HiraKaku =quartzFont(c("HiraginoSans-W3", "HiraginoSans-W6", "HiraginoSans-W3", "HiraginoSans-W6")))
# ヒラギノがHelveticaにくらべて細めにみえるので、ウエイトを増やす
quartzFonts(HiraKaku = quartzFont(c("HiraginoSans-W5", "HiraginoSans-W7", "HiraginoSans-W5", "HiraginoSans-W7")))

# フォントファミリーを確認
quartzFonts()

# テーマを設定し、フォントも定義しておく
# デフォルトのテーマの場合
# theme_set(theme_bw(base_family = "HiraKaku"))
# cowplotのテーマを使う場合
# theme_set(theme_cowplot(font_family = "HiraKaku"))
# 日本語が大きめになるのでデフォルトのサイズ14から12へ
theme_set(theme_cowplot(font_family = "HiraKaku", font_size = 12)) 

# タイトルとアノテーションを日本語にしてグラフを描く
myplot <- ggplot(heightweight, aes(x=ageYear, y=heightIn)) +
  geom_point() +
  ggtitle("日本語タイトル") +
  annotate("text", x=15, y=53, label="アノテーション", family="HiraKaku")
# テーマでのフォントの定義がannotate("text")には及ばないらしい

myplot
# プロットエリアに日本語が表示された

# PNGで保存
ggsave("myplot.png", width = 5, height = 4)
# 日本語の入ったグラフがPNGで保存された

# PDFで保存
# ggsave("myplot.pdf", width = 5, height = 4)
# 以下のエラーがでて、PDFができない
# grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y,  でエラー: 
# フォントタイプが不正です 
# 追加情報:  50 件以上の警告がありました (最初の 50 個の警告を見るには warnings() を使って下さい) 

# プロットエリアのグラフをExportコマンドでPDFに保存すると、PDFはできるが日本語の部分が消えている。

# quartzを使うとPDFで保存できた。
# https://books.google.co.jp/books?id=hSyBDwAAQBAJ&pg=PA111&lpg=PA111&dq=ggsave+pdf+日本語&source=bl&ots=GVX6GsEKuc&sig=ACfU3U1UdNpsFj4e5IC6459gI_2MV2RBbA&hl=ja&sa=X&ved=2ahUKEwiup9H3nrzmAhUCxYsBHSk-BfY4ChDoATABegQIChAB#v=onepage&q=ggsave%20pdf%20日本語&f=false
quartz(file = "myplot.pdf", type = "pdf", family = "HiraKaku", width = 5, height = 4,
       pointsize = 10)
print(myplot)
dev.off()