Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mac でも Windows でも, PNG でも PDF でもRのグラフに好きなフォントで日本語を表示したい (2020年最終版)/Display-CJK-Font-in-Any-Gpraphic-Device-and-Platform-2020

A4d1023b1de7890c67a083d14573882d?s=47 S-Katagiri
December 05, 2020

Mac でも Windows でも, PNG でも PDF でもRのグラフに好きなフォントで日本語を表示したい (2020年最終版)/Display-CJK-Font-in-Any-Gpraphic-Device-and-Platform-2020

Speaeker Deck 上では画像の劣化が激しいため, ダウンロードしてご覧ください
2020/12/05 Japan.R 発表用

A4d1023b1de7890c67a083d14573882d?s=128

S-Katagiri

December 05, 2020
Tweet

Transcript

  1. Mac でも Windows でも, PNG でも PDF でも R のグラフに好きなフォント

    で日本語を表示したい 2020 年最終版 - 修正版 (2) 差し戻し - コピー (2).pdf Katagiri, Satoshi (ill-identified) 2020-12-05 (Japan.R) 1
  2. 目次 前置き 本題 ちょっと応用 (この辺から新情報) 速報 技術的な解説 2

  3. 前置き

  4. 宣伝 • このスライドは rmdja パッケージによって作成され ました • プレゼン資料, 文書, 縦書き小説を

    R Markdown で作 成するためのパッケージです 3
  5. おわび • アンケート募集したけど挫折した •「お買い得物件」問題に取り組んでいたが難しかった • 進展はあるが R の出番がほぼない • 去年のようなネタ発表を期待した方へ:

    ごめんなさい • 4 つ目に投票した方へ: お前の顔覚えたからな • そのうち公開します 4
  6. 自己紹介 • ブログ • 主語の大きい話をします •『「全数調査なら何でもわかる」という誤解』 •『計量経済学と機械学習の関係』 •『おまえは万物を RSTUDIO で書ける』

    • 主語の変な話もします •『飯野山 (讃岐富士) は正規分布らしいのでパラメータ を推定する』 •『三國志で学ぶデータ分析』(Japan.R ’19) •『R でカラオケをする』(2019 年エイプリルフール) • 時事ネタに乗っかることもあります •『R とパンデミックの数理モデル新型コロナウィルス (COVID-19) 研究を例に』 •『「AI の正体は最小二乗法」記事を読み解く』 5
  7. 最近のできごと ウクライナ大使に料理の出来を褒められた 6

  8. 本題

  9. 発表の概要 • 今年 10 月にブログで紹介した自作パッケージの宣伝 • fontregisterer を使えという話 • グラフの日本語表示でよくトラブってる話を聞くの

    で対処法をまとめた • 上記の補足説明と新情報 • ver. 0.2 の話 • 30 分前まで修正してたのは秘密 • 20 分枠としてはちょっと退屈な話かも 7
  10. RStudio でグラフが文字化けした経験は? ggplot(mtcars, aes(x = disp, y = mpg)) +

    geom_point() + labs(title = " 游ゴシック", x = " 游明朝") • あるいは保存したら文字化けした経験は? • “Export” したら文字化けした経験は? 8
  11. こんなエラー/警告が大量に表示された経験は? 9

  12. Q: Windows で日本語が表示できない? • A: フォント名に "Japan1Ryumin" とか "Japan1GothicBBB" などと指定するといいよ

    • B: showtext とか extrafont とかのパッケージ が必要 正解: なくてもできます 10
  13. Q: Mac で日本語が表示できない? • A: "HiraminProN-W3" を指定するといいよ • B: やはりなんらかのパッケージが必要だよ

    正解: パッケージなくてもできます 11
  14. fontregisterer で解決します 12

  15. fontregisterer とは • R のグラフでの日本語表示補助パッケージ • PC にインストールされたフォントほとんどが使用可 • github

    で公開中 remotes::install_github( "Gedevan-Aleksizde/fontregisterer", repos = NULL ) • Mac は Cairo と XQuartz が必要 brew install cairo brew cask install xquartz 13
  16. インストールに関する細かい注意事項 • Linux 系は fontregisterer 不要 • (たぶん. Unbutu しか使ってないけど)

    • fontconfig による OS 標準フォントの設定が反映 • フォント名を取得する systemfont のみ必要 • フォント名取得関数は一応動作する • Windows は要 systyemfonts の手動インストール? • remotes::install_github() の不具合? 14
  17. 結局パッケージインストールしてるじゃん 目新しいこと/難しいことは一切していない • 基本的に数年前から存在する機能を使ってるだけ • ほとんどはヘルプドキュメントに書いてある話 • グラフィックデバイスの設定変更しかしてない • 面倒な設定を自動一括設定してるだけ

    • グラフィックデバイス自体を改造していない 15
  18. できること/できないこと • できる: • 標準グラフィック & ggplot2 系での日本語フォント 表示と保存 •

    主に PNG, SVG, PDF での保存を想定 • できない: • 外部ソフトに頼ったグラフィックへの対応 • shiny とか plotly とか tikz とか 16
  19. Noto Sans CJK JP Noto Sans CJK JP Noto Sans

    CJK JP Noto Sans CJK JP Noto Serif CJK JP Noto Serif CJK JP Noto Serif CJK JP Noto Serif CJK JP Oradano明朝GSRR Oradano明朝GSRR Oradano明朝GSRR Oradano明朝GSRR 出島明朝 出島明朝 出島明朝 出島明朝 白舟篆書教漢 白舟篆書教漢 白舟篆書教漢 白舟篆書教漢 白舟隷書教漢 白舟隷書教漢 白舟隷書教漢 白舟隷書教漢 Morpheus Morpheus Morpheus Morpheus Akkadian Dejima Morpheus Noto Sans CJK JP Noto Serif CJK JP Oradano-Mincho-GSRR 白舟隷書教漢 白舟篆書教漢 plain bold italic bold italic 17
  20. 使い方 1: 読み込み require(fontregisterer) # 1 はゴシック, 2 は明朝 goth

    <- get_standard_ja_fonts()[1] mincho <- get_standard_ja_fonts()[2] print(c(goth, mincho)) sans serif "Noto Sans CJK JP" "Noto Serif CJK JP" 18
  21. 使い方 2: フォント選択 • goth, mincho は OS 標準フォントファミリ名が代入 されている

    • uinque(systemfonts::system_fonts()$family) で表示されるフォントが使用可 • OS ごとにフォントが変わるので以降は goth/mincho で統一 19
  22. OS ごとの標準フォント 表 1: get_standard_ja_fonts() が返す名前一覧 ゴシック 明朝 Win (

    >= 8) 游ゴシック 游明朝 Win (< 8) MS ゴシック MS 明朝 Mac ヒラギノ角ゴシック ヒラギノ明朝 ProN Linux Noto Sans CJK JP Noto Serif CJK JP それ以外 (OS 特定失敗) IPA ゴシック IPA 明朝 (IPA 指定は気休め感があるが...) • 実際の名称は OS ごとに異なる • 例: Yu Mincho と YuMincho • 例: ヒラギノ角ゴシックは実際には "Hiragino Sans" という名称 20
  23. 使い方 3: 標準グラフィックスの場合 • family 引数があるところはだいたい有効 • font はフォント名ではなくスタイル par(family

    = as.character(goth)) plot(0, 0, main = " 日本語表示で広がる R の世界") text(0, .5, " 可能ならば斜体で表示", font = 3) -1.0 -0.5 0.0 0.5 1.0 -1.0 0.0 0.5 1.0 日本語表示で広がるRの世界 0 0 可能ならば斜体で表示 21
  24. 使い方 4: ggplot2 (+ ggrepel) の場合 as_tibble(mtcars, rownames = "nm")

    %>% ggplot(aes(x = mpg, y = hp, label = nm)) + geom_text_repel(family = mincho) + theme(text = element_text( family = goth, face = 3 )) + labs(title = "ggrepel も可") Datsun 710 Valiant Duster 360 Merc 240D Merc 230 Merc 280C Merc 450SE Merc 450SLC Cadillac Fleetwood Lincoln Continental Chrysler Imperial Fiat 128 Honda Civic Toyota Corolla Dodge Challenger AMC Javelin Camaro Z28 Pontiac Firebird Fiat X1-9 Lotus Europa Ford Pantera L Ferrari Dino Maserati Bora 100 200 300 10 15 20 25 30 35 mpg hp ggrepel も可 22
  25. 使い方 5-1: PNG で保存 • png で保存 • jpeg も可

    • png(...) で始めると画像が表示されないため dev.copy() オススメ • ggplot2 のグラフなら ggsave() がより簡単 par(family = goth) plot(...) dev.copy(png, filename = "Rplot.pdf") dev.off() ggplot() + ... ggsave("Rplot.png") 23
  26. 使い方 5-2: PDF で保存 • cairo_pdf で保存 • フォント埋め込みが簡単なため •

    pdf はダメ plot(...) dev.copy(cairo_pdf, filename = "Rplot.pdf") dev.off() ggplot() + ... ggsave("Rplot.pdf", device = cairo_pdf) 24
  27. 補足: Mac の場合 Mac なら quartz, type = "pdf" も可

    plot(...) dev.copy(quartz, filename = "Rplot.pdf", type = "pdf") ↪ dev.off() ggplot() + ... ggsave("Rplot.pdf", device = quartz, type = "pdf") ↪ 25
  28. 使い方 5-3: SVG での保存 • SVG 形式は svglite::svglite を指定 •

    デフォルトの svg はアウトライン化してしまう • 用途によってはこちらもアリ • コピペ防止とか? ggplot() + ... ggsave("Rplot.svg", device = svglite::svglite) 26
  29. ちょっと応用 (この辺から新情報)

  30. ggthemes のフォント変更 • ggthemes 系のテーマ関数は base_family = ggplot(...) + geom_text(family

    = goth) + theme_stata(base_family = goth) 27
  31. geom_text() だけフォントが変わらない? • geom_text() 系の関数は theme() と別個に設定 • geom_label(), geom_text_repel()

    も同様 • デフォルト設定の変更は以下のように update_geom_defaults(geom = "text", list(family = goth)) ↪ update_geom_defaults(geom = "label", list(family = goth)) ↪ 28
  32. ggplot2 派生パッケージでの扱い • 基本的にフォントファミリ名を書けばいい • patchwork や grid/gridExtra でも使用可能 •

    gridExtra: gp = gpar(fontfamily = ) みたいな のが必要 • patchwork: theme = に theme() ごと与える • 詳しくはブログのほうを gridExtra::grid.arrange(..., top = textGrob(" タイトル", gp = gpar(fontfamily = goth)) ↪ ) ... + patchwork::plot_annotation(..., theme = theme(text = element_text(family = goth))) ↪ 29
  33. rmdja での出力 • 自作の日本語向け R Markdown 文書作成パッケージ • R Markdown

    は dev オプションでグラフィックデバ イス指定 • デフォルトで自動切り替えするように変更 • HTML: png • PDF: cairo_pdf • 本文とグラフのフォントを統一する機能は未実装 30
  34. PowerPoint/Keynote へのエクスポート • R-wakalang に最近投稿された質問を契機に検証 • 今までは勝手にラスタ変換 & 劣化させられた •

    PP ver. 1712 以降? で SVG 対応 • svglite::svglite または svg で保存 • ドラッグ & ドロップで貼り付け • export パッケージも使用可能 •「図への変換」でパワーポイント上で編集可 • Keynote は SVG/PDF 対応 • ドラッグ & ドロップで貼り付け • 編集はできない 31
  35. (新機能) エラーメッセージの日本語化 • 日本語ロケールにするとメッセージが日本語になる • パッケージのローカライズの方法も分かりにくいの でそのうちどっかに解説書きます 32

  36. (新機能) フォント設定すら面倒い? theme(text = element_text()) とか par(family = ) とかいちいち書くのすら面倒?

    set_ja_font_standard() • ggplot2 のデフォルトフォントを変更 • theme_set() などを呼び出している • geom_text() 系のフォントも日本語表示設定 • ggrepel ロード済みならこれにも適用 • デフォルトの挙動が変わるので自動で実行されない 33
  37. 既知の不具合 • フォントレンダ関連の技術の助言求む • Windows • BIZ UD など一部フォントがうまく読み込まれない •

    標準以外のスタイルが正常に表示できない可能性 • png 以外のデバイスで PNG として保存 • Mac • 基本的に標準フォントしか使えない • 日本語フォントには変形フォントの実体がないため • Cairo がちゃんと使えれば改善される? • quartz 使ったほうが安定するかも? • 各 OS 最低 1 つの標準フォントは使える 34
  38. fontregisterer 最高! これさえあればもう困らないね! さあ今すぐインストール! 35

  39. 速報

  40. 早くもこのパッケージ 不要になりそう 図 1: Napoleon on Board the Bellerophon by

    William Quiller Orchardson, public domain 百日未満天下の可能性も… 36
  41. RStudio Ver. 1.4 以降の新機能: バックエンド変更 • グローバルオプションに “Graphics” 追加 •

    “Backend” を設定 • Mac: AGG • Win: Cairo or AGG • フォント登録なしでフォント指定可能に • フォント登録が必要だったのはデフォルトデバイス • “Export” か, ragg::agg_png デバイス等で保存 37
  42. RStudio Ver. 1.4 の新機能: cairo_pdf オプション • PDF エクスポート時の cairo_pdf

    オプションも • 以前は pdf 強制だったので日本語表示できなかった • もちろん従来どおりの方法も可 38
  43. このパッケージいらないじゃん... • いちおうまだ安定版ではない • リリースまでのつなぎにお使いください • フォント名の指定は必要 • フォント名取得や ggplot2

    の設定変更は使えるはず • Windows では ragg でうまく保存できない? • ggsave() でのみうまく保存できなかった • 某氏に CRAN 登録を勧められたけどこれならやらな くてもいいかなって 39
  44. 技術的な解説

  45. HiraMinProN-W3 とか HiraginoSans-W3 とか • ヒラギノ明朝 ProN W3/ヒラギノ角ゴシック W3 Regular

    のこと • フォントファミリ名ではなく Postscript 名 • これも単体としてフォントを参照できる • グラフィックデバイスによってはうまくいかない •「保存すると文字化け」の原因の 1 つ • もちろん Mac 以外には入ってない • R ではファミリ名を選ぼう 40
  46. "Japan1Ryumin", "Japan1GothicBBB" の意味 • 開発者の解説 [2] • 普通の PC には入っていないフォント

    • pdf() で指定可能な数少ない日本語フォント • DTP フォントとしての地位があったため? (Adobe-Japan1) • フォント埋め込みはしない • PDF で保存し Adobe Reader で見れば文字化けしな い (らしい) • 現在では利点少ない • フォント埋め込みが普及 (学術論文の要件にも) • Mac も Linux も (最近は Windows も) Adobe Reader は使わない • PC にインストールされたフォントから選ぼう • cairo_pdf() を使おう 41
  47. pdf と cairo_pdf の違い • pdf: 昔からあるデバイス • フォント埋め込み機能なし •

    Ghostscript で後から埋め込む必要 • そんな回りくどいことやりたくない • cairo_pdf: Cairo デバイスで PDF を生成 • フォント埋め込みに対応 • 微妙なレンダリング差異 • ちょっと字が太くなる? • どちらも現在は基本パッケージに入っている • 数文字見てフォント特定できるレベルの人以外気に ならない差異 42
  48. showtext パッケージ • 開発者 [3]「cairo_pdf が使えないときに文字を画像 化することで pdf でもいろいろな文字に対応」 •

    長所: • 最短で library(showtext); showtext_auto() の みで機能 • Linux 以外では一種のフォールバック機能 • むしろコピペをさせたくない場合? • 短所: • 任意のフォントを使うなら結局登録が必要 • PDF にフォントを埋め込まない • cairo_pdf が使えないことはあまりない • 完全下位互換ではないがやや限定的 43
  49. showtext の出力例 • 結局フォントを登録する必要 • fontregisterer とは別の方法が必要 •「文字化けさえしなければなんでもいい」ならアリ? 44

  50. extrafont パッケージ • 開発者 [1]「pdf() の標準 POSTSCRIPT フォント以 外も使用可能に」 •

    字間処理がおかしくなることがある • 埋め込むわけではない • cairo_pdf() のほうが簡単 45
  51. OS ごとのフォント事情の違い • Windows は WindowsFonts() でフォントファミリ の登録が必要 • Mac

    は quartzFonts() で登録 • 斜体のない日本語フォントは斜体にできない • (Cairo が使えれば斜体にできる?) • fontregisterer でこれらの登録を一括処理 • Linux 系は登録不要 • フォントファミリ名さえ分かればいい • 勝手にフォールバックもしてくれる • (なので私にとってはあまり必要なかった) • Ubuntu 以外は自分で使えるファミリ名を見つける 必要 46
  52. 補足: フォントの手動登録方法 • 基本的には fontregisterer がやってくれる • Mac でヒラギノのウェイトを変えたい時とか •

    Win はファミリ名を変えると保存できない可能性 • MEI = windowsFont("Meiryo") は不可 • 表示だけならできるのでややこしい # Win windowsFonts( `ファミリ名` = windowsFont(" ファミリ名") ) # Mac: 標準, 太字, 斜体, 太字斜体の順に 4 つ設定 quartzFonts( `ファミリ名` = quartzFont(rep("POSTSCIPT 名", 4)) ↪ 47
  53. まとめ • 日本語表示には要フォント登録 • Win は windowsFonts() • Mac は

    quartzFonts() • fontregisterer は一括自動登録 • RStudio 1.4 以降は上記おそらく不要に • RStudio のオプションで対処 • フォント指定は適切に 1. PC にインストールされているフォントを 2. フォントファミリ名で指定する • Linux は以上を気にせずに使える • 仮想環境 or クラウドで Ubuntu を使おう • 特に Win はロケールの問題もある 48
  54. 参考文献

  55. Chang, Winston (2014). extrafont: Tools for using fonts. R package

    version 0.17. URL: here. Murell, Paul, Brian Ripley (2006). “Non-Standard Fonts in Postscript and PDF Graphics”. In: R News 6.2, pp. 41–46. URL: here. Qiu, Yixuan (2015). “Showtext: Using System Fonts in r Graphics”. In: The R Journal 7.1, pp. 99–108. DOI: 10.32614/RJ-2015-008. URL: here. 49