Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

前置き

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

本題

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

fontregisterer で解決します 12

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

使い方 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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

使い方 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

Slide 24

Slide 24 text

使い方 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

Slide 25

Slide 25 text

使い方 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

Slide 26

Slide 26 text

使い方 5-2: PDF で保存 • cairo_pdf で保存 • フォント埋め込みが簡単なため • pdf はダメ plot(...) dev.copy(cairo_pdf, filename = "Rplot.pdf") dev.off() ggplot() + ... ggsave("Rplot.pdf", device = cairo_pdf) 24

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

速報

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

技術的な解説

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

参考文献

Slide 55

Slide 55 text

[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