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

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 発表用
2021/9/10 書き間違え修正

2021年版: https://ill-identified.hatenablog.com/entry/2021/09/10/231230

S-Katagiri

December 05, 2020
Tweet

More Decks by S-Katagiri

Other Decks in Programming

Transcript

  1. Mac でも Windows でも, PNG でも
    PDF でも R のグラフに好きなフォント
    で日本語を表示したい 2020 年最終版 -
    修正版 (2) 差し戻し - コピー
    (2)_2021 年修正版.pdf
    Katagiri, Satoshi (ill-identified)
    2020-12-05 (Japan.R) (2021/09/10 更新)
    1

    View Slide

  2. 目次
    前置き
    本題
    ちょっと応用 (この辺から新情報)
    速報
    技術的な解説
    参考文献
    2

    View Slide

  3. 前置き

    View Slide

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

    View Slide

  5. おわび
    • アンケート募集したけど挫折した
    •「お買い得物件」問題に取り組んでいたが難しかった
    • 進展はあるが R の出番がほぼない
    • 去年のようなネタ発表を期待した方へ: ごめんなさい
    • 4 つ目に投票した方へ: お前の顔覚えたからな
    • そのうち公開します
    4

    View Slide

  6. 自己紹介
    • ブログ
    • 主語の大きい話をします
    •『「全数調査なら何でもわかる」という誤解』
    •『計量経済学と機械学習の関係』
    •『おまえは万物を RSTUDIO で書ける』
    • 主語の変な話もします
    •『飯野山 (讃岐富士) は正規分布らしいのでパラメー
    タを推定する』
    •『三國志で学ぶデータ分析』(Japan.R ’19)
    •『R でカラオケをする』(2019 年エイプリルフール)
    • 時事ネタに乗っかることもあります
    •『R とパンデミックの数理モデル新型コロナウィルス
    (COVID-19) 研究を例に』
    •『「AI の正体は最小二乗法」記事を読み解く』
    5

    View Slide

  7. 最近のできごと
    ウクライナ大使に料理の出来を褒められた
    6

    View Slide

  8. 本題

    View Slide

  9. 発表の概要
    • 今年 10 月にブログで紹介した自作パッケージの宣伝
    • fontregisterer を使えという話
    • グラフの日本語表示でよくトラブってる話を聞くの
    で対処法をまとめた
    • 上記の補足説明と新情報
    • ver. 0.2 の話
    • 30 分前まで修正してたのは秘密
    • 20 分枠としてはちょっと退屈な話かも
    7

    View Slide

  10. RStudio でグラフが文字化けした経験は?
    ggplot(mtcars, aes(x = disp, y = mpg)) +
    geom_point() +
    labs(title = " 游ゴシック", x = " 游明朝")
    • あるいは保存したら文字化けした経験は? 8

    View Slide

  11. こんなエラー/警告が大量に表示された経験は?
    9

    View Slide

  12. Q: Windows で日本語が表示できない?
    • A: フォント名に "Japan1Ryumin" とか
    "Japan1GothicBBB" などと指定するといいよ
    • B: showtext とか extrafont とかのパッケージが必要
    正解:
    なくてもできます
    10

    View Slide

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

    View Slide

  14. fontregisterer で解決します
    12

    View Slide

  15. fontregisterer とは
    • R のグラフでの日本語表示補助パッケージ
    • PC にインストールされたフォントほとんどが使用可
    • github で公開中
    remotes::install_github(
    "Gedevan-Aleksizde/fontregisterer",
    repos = NULL
    )
    • Mac は Cairo と XQuartz が必要
    brew install cairo
    brew cask install xquartz 13

    View Slide

  16. インストールに関する細かい注意事項
    • Linux 系は fontregisterer 不要
    • (たぶん. Unbutu しか使ってないけど)
    • fontconfig による OS 標準フォントの設定が反映
    • フォント名を取得する systemfont のみ必要
    • フォント名取得関数は一応動作する
    • Windows は要 systyemfonts の手動インストール?
    • remotes::install_github() の不具合?
    14

    View Slide

  17. 結局パッケージインストールしてるじゃん
    目新しいこと/難しいことは一切していない
    • 基本的に数年前から存在する機能を使ってるだけ
    • ほとんどはヘルプドキュメントに書いてある話
    • グラフィックデバイスの設定変更しかしてない
    • 面倒な設定を自動一括設定してるだけ
    • グラフィックデバイス自体を改造していない
    15

    View Slide

  18. できること/できないこと
    • できる:
    • 標準グラフィック & ggplot2 系での日本語フォント
    表示と保存
    • 主に PNG, SVG, PDF での保存を想定
    • できない:
    • 外部ソフトに頼ったグラフィックへの対応
    • shiny とか plotly とか tikz とか
    16

    View Slide

  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

    View Slide

  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

    View Slide

  21. 使い方 2: フォント選択
    • goth, mincho は OS 標準フォントファミリ名が代入
    されている
    • uinque(systemfonts::system_fonts()$family) で表
    示されるフォントが使用可
    • OS ごとにフォントが変わるので以降は goth/mincho
    で統一
    19

    View Slide

  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

    View Slide

  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.5 0.0 0.5 1.0
    日本語表示で広がるRの世界
    0
    可能ならば斜体で表示
    21

    View Slide

  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 230
    Merc 280C
    Merc 450SE
    Merc 450SLC
    Cadillac Fleetwood
    Lincoln Continental Chrysler Imperial
    Fiat 128
    Toyota Corolla
    Dodge Challenger
    AMC Javelin
    Camaro Z28
    Fiat X1-9
    Lotus Europa
    Ford Pantera L
    Ferrari Dino
    Maserati Bora
    100
    200
    300
    hp
    ggrepel も可
    22

    View Slide

  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

    View Slide

  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

    View Slide

  27. 補足: Mac の場合
    Mac なら quartz, type = "pdf" も可
    ggsave() には使えない?
    plot(...)
    dev.copy(quartz, file = "Rplot.pdf", type = "pdf")
    dev.off()
    25

    View Slide

  28. 使い方 5-3: SVG での保存
    • SVG 形式は svglite::svglite を指定
    • デフォルトの svg はアウトライン化してしまう
    • 用途によってはこちらもアリ
    • コピペ防止とか?
    ggplot() + ...
    ggsave("Rplot.svg", device = svglite::svglite)
    26

    View Slide

  29. ちょっと応用 (この辺から新情報)

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  33. rmdja での出力
    • 自作の日本語向け R Markdown 文書作成パッケージ
    • R Markdown は dev オプションでグラフィックデバイ
    ス指定
    • デフォルトで自動切り替えするように変更
    • HTML: png
    • PDF: cairo_pdf
    • 本文とグラフのフォントを統一する機能は未実装
    30

    View Slide

  34. PowerPoint/Keynote へのエクスポート
    • R-wakalang に最近投稿された質問を契機に検証
    • 今までは勝手にラスタ変換 & 劣化させられた
    • PP ver. 1712 以降? で SVG 対応
    • svglite::svglite または svg で保存
    • ドラッグ & ドロップで貼り付け
    • export パッケージも使用可能
    •「図への変換」でパワーポイント上で編集可
    • Keynote は SVG/PDF 対応
    • ドラッグ & ドロップで貼り付け
    • 編集はできない
    31

    View Slide

  35. (新機能) エラーメッセージの日本語化
    • 日本語ロケールにするとメッセージが日本語になる
    • パッケージのローカライズの方法も分かりにくいの
    でそのうちどっかに解説書きます
    32

    View Slide

  36. (新機能) フォント設定すら面倒い?
    theme(text = element_text()) とか par(family = ) と
    かいちいち書くのすら面倒?
    set_ja_font_standard()
    • ggplot2 のデフォルトフォントを変更
    • theme_set() などを呼び出している
    • geom_text() 系のフォントも日本語表示設定
    • ggrepel ロード済みならこれにも適用
    • デフォルトの挙動が変わるので自動で実行されない
    33

    View Slide

  37. 既知の不具合
    • フォントレンダ関連の技術の助言求む
    • Windows
    • BIZ UD など一部フォントがうまく読み込まれない
    • 標準以外のスタイルが正常に表示できない可能性
    • png 以外のデバイスで PNG として保存
    • Mac
    • 基本的に標準フォントしか使えない
    • 日本語フォントには変形フォントの実体がないため
    • Cairo がちゃんと使えれば改善される?
    • quartz 使ったほうが安定するかも?
    • 各 OS 最低 1 つの標準フォントは使える
    34

    View Slide

  38. fontregisterer 最高!
    これさえあればもう困らないね!
    さあ今すぐインストール!
    35

    View Slide

  39. 速報

    View Slide

  40. 早くもこのパッケージ
    不要になりそう
    図 1: Napoleon on Board the Bellerophon by William Quiller
    Orchardson, public domain
    百日未満天下の可能性も… 36

    View Slide

  41. RStudio Ver. 1.4 以降の新機能: バックエンド変更
    • グローバルオプションに “Graphics” 追加
    • “Backend” を設定
    • Mac: AGG
    • Win: Cairo or AGG
    • フォント登録なしでフォント指定可能に
    • フォント登録が必要だったのはデフォルトデバイス
    • “Export” か, ragg::agg_png デバイス等で保存
    37

    View Slide

  42. RStudio Ver. 1.4 の新機能: cairo_pdf オプション
    • PDF エクスポート時の cairo_pdf オプションも
    • 以前は pdf 強制だったので日本語表示できなかった
    • もちろん従来どおりの方法も可
    38

    View Slide

  43. このパッケージいらないじゃ
    ん...
    • いちおうまだ安定版ではない
    • リリースまでのつなぎにお使いください
    • フォント名の指定は必要
    • フォント名取得や ggplot2 の設定変更は使えるはず
    • Windows では ragg でうまく保存できない?
    • ggsave() でのみうまく保存できなかった
    • 某氏に CRAN 登録を勧められたけどこれならやらな
    くてもいいかなって
    39

    View Slide

  44. 技術的な解説

    View Slide

  45. HiraMinProN-W3 とか HiraginoSans-W3 とか
    • ヒラギノ明朝 ProN W3/ヒラギノ角ゴシック W3
    Regular のこと
    • フォントファミリ名ではなく Postscript 名
    • これも単体としてフォントを参照できる
    • グラフィックデバイスによってはうまくいかない
    •「保存すると文字化け」の原因の 1 つ
    • もちろん Mac 以外には入ってない
    • R ではファミリ名を選ぼう
    40

    View Slide

  46. "Japan1Ryumin", "Japan1GothicBBB" の意味
    • 開発者の解説 [2]
    • 普通の PC には入っていないフォント
    • pdf() で指定可能な数少ない日本語フォント
    • DTP フォントとしての地位があったため?
    (Adobe-Japan1)
    • フォント埋め込みはしない
    • PDF で保存し Adobe Reader で見れば文字化けしない
    (らしい)
    • 現在では利点少ない
    • フォント埋め込みが普及 (学術論文の要件にも)
    • Mac も Linux も (最近は Windows も) Adobe Reader
    は使わない
    • PC にインストールされたフォントから選ぼう
    • cairo_pdf() を使おう 41

    View Slide

  47. pdf と cairo_pdf の違い
    • pdf: 昔からあるデバイス
    • フォント埋め込み機能なし
    • Ghostscript で後から埋め込む必要
    • そんな回りくどいことやりたくない
    • cairo_pdf: Cairo デバイスで PDF を生成
    • フォント埋め込みに対応
    • 微妙なレンダリング差異
    • ちょっと字が太くなる?
    • どちらも現在は基本パッケージに入っている
    • 数文字見てフォント特定できるレベルの人以外気に
    ならない差異
    42

    View Slide

  48. showtext パッケージ
    • 開発者 [3]「cairo_pdf が使えないときに文字を画像
    化することで pdf でもいろいろな文字に対応」
    • 長所:
    • 最短で library(showtext); showtext_auto() のみで
    機能
    • Linux 以外では一種のフォールバック機能
    • むしろコピペをさせたくない場合?
    • 短所:
    • 任意のフォントを使うなら結局登録が必要
    • PDF にフォントを埋め込まない
    • cairo_pdf が使えないことはあまりない
    • 完全下位互換ではないがやや限定的
    43

    View Slide

  49. showtext の出力例
    • 結局フォントを登録する必要
    • fontregisterer とは別の方法が必要
    •「文字化けさえしなければなんでもいい」ならアリ?
    44

    View Slide

  50. extrafont パッケージ
    • 開発者 [1]「pdf() の標準 POSTSCRIPT フォント以外
    も使用可能に」
    • 字間処理がおかしくなることがある
    • 埋め込むわけではない
    • cairo_pdf() のほうが簡単
    45

    View Slide

  51. OS ごとのフォント事情の違い
    • Windows は WindowsFonts() でフォントファミリの登
    録が必要
    • Mac は quartzFonts() で登録
    • 斜体のない日本語フォントは斜体にできない
    • (Cairo が使えれば斜体にできる?)
    • fontregisterer でこれらの登録を一括処理
    • Linux 系は登録不要
    • フォントファミリ名さえ分かればいい
    • 勝手にフォールバックもしてくれる
    • (なので私にとってはあまり必要なかった)
    • Ubuntu 以外は自分で使えるファミリ名を見つける必

    46

    View Slide

  52. 補足: フォントの手動登録方法
    • 基本的には fontregisterer がやってくれる
    • Mac でヒラギノのウェイトを変えたい時とか
    • Win はファミリ名を変えると保存できない可能性
    • MEI = windowsFont("Meiryo") は不可
    • 表示だけならできるのでややこしい
    # Win
    windowsFonts(
    `ファミリ名` = windowsFont(" ファミリ名")
    )
    # Mac: 標準, 太字, 斜体, 太字斜体の順に 4 つ設定
    quartzFonts(
    `ファミリ名` = quartzFont(rep("POSTSCIPT 名", 4))
    ) 47

    View Slide

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

    View Slide

  54. 参考文献

    View Slide

  55. [1] Winston Chang. extrafont: Tools for using fonts. R package version
    0.17. 2014. url: https://CRAN.R-project.org/package=extrafont.
    [2] Paul Murell and Brian Ripley. “Non-Standard Fonts in Postscript
    and PDF Graphics”. In: R News 6.2 (2006), pp. 41–46. url:
    https://cran.r-project.org/doc/Rnews/Rnews_2006-2.pdf.
    [3] Yixuan Qiu. “Showtext: Using System Fonts in r Graphics”. In: The
    R Journal 7.1 (2015), pp. 99–108. doi: 10.32614/RJ-2015-008.
    url: https://doi.org/10.32614/RJ-2015-008.
    49

    View Slide