『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には対応していないので、その場合は結局上の方法で