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()

 

macOS 11.4、RStudio 1.4.1717、R 4.1.0で、またやってみた。

# グラフに日本語を入れてファイルに保存する
# 日本語が文字化けするので、ハマりがち

# https://heavywatal.github.io/rstats/ggplot2.html より改変

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

# ライブラリーを読み込む
library(tidyverse)

# 組み込みデータmpgを確認
# mpgについてはこちら
# https://ggplot2.tidyverse.org/reference/mpg.html
mpg

# グラフを描く
p5 <-
ggplot(data = mpg) + # mpgデータでキャンバス準備
aes(x = displ, y = cty) + # displ,cty列をx,y軸にmapping
geom_point() + # 散布図を描く
facet_wrap(~ drv) + # drv列に応じてパネル分割
theme_bw() # テーマをbwに変更
print(p5)

# PNGファイルに保存する
# dpiで解像度を指定できる(デフォルトは300)。パワポやWordには300で十分。出版原稿には大きく(600など)
ggsave("mpgE.png", p5, width = 6, height = 4, dpi = 300)

# PDFファイルに保存する
ggsave("mpgE.pdf", p5, width = 6, height = 4)

# グラフに日本語を入れてみる
# これだと日本語が化ける
p6 <-
p5 +
xlab("排気量(リットル)") + 
ylab("燃費(マイル/ガロン)") 
print(p6)

# themeでフォント指定をすると文字化けが直る
p7 <-
p6 +
theme_bw(base_family = "HiraKakuPro-W3") # 日本語のフォント指定:macOS用
print(p7)

# PNGで保存
# 日本語も大丈夫なはず
ggsave("mpgJ.png", p7, width = 6, height = 4)

# PDFに保存
# 出版用にはPDFのほうが拡大縮小に耐えるので、出版原稿にしたり大きく印刷するなどのときによい

# ggsaveで保存してみる
# 日本語が消え、グラフが乱れる
ggsave("mpgJ.pdf", p7, width = 6, height = 4)

# 別な方法で
# https://oku.edu.mie-u.ac.jp/~okumura/stat/first.html
# print()の出力先をQuartzにするよと指定
# QuartzはmacOS標準の画像処理エンジンで、画面出力や紙への印刷などを扱っている
# この場合Quartzで描かれる画像をファイルに「印刷」するように指定している
# Macでしか使えない方法
# pointsize=10がデフォルトらしい。10のままでよければ省略可
quartz(file = "mpgJ_quartz.pdf", type = "pdf", family = "HiraKaku", width = 6, height = 4, pointsize = 10)
# 出力する
print(p7)
# 出力先をデフォルト(RStudioのPlots)に戻す
dev.off()

# この先は参考まで
# 文字処理を国際化するためのraggパッケージがtidyverseの開発者からでた
# フォント関係がスッキリ処理できるようになるらしい
# https://www.tidyverse.org/blog/2021/02/modern-text-features/
library(ragg)

# ggsave()でデバイスをagg_png, agg_tiffなどと指定する
# グラフ中でフォント指定してなくても(p6の状態)、日本語がでる
ggsave(device = agg_png, "mpgJ_ragg.png", p6, width = 6, height = 4)

# デバイスにPDFがない(agg_pdfというのはない)ので、PDFに保存したいときは使えない

# raggを常に使うようにすることもできる
# RStudioで、Preferences > General > Graphics > Backend と進み、AGGを選択する
# こうするとPlotsの画面表示にもファイル保存にもAGGが使われるようになる
# しかしPDFには対応していないので、その場合は結局上の方法で