【ggplot2】 好きなフォントを適用できるようにする
趣旨
可視化したデータを書類に貼り付ける際、図表内のフォントと書類のフォントは統一させておきたいものです。
そんな時に使える技を備忘録として記しておきます。
環境
- Windows x64
- フォントファイルは
TTF
形式で用意
TTF
形式で用意あくまでWindows向けの記事です。
Macは仕様が微妙に違うらしいので参考になるとは限りません。
おおまかな流れ
-
{extrafont}
内にローカル上のTTFファイルのデータベースを作成する
- 登録したフォントを
windowsFonts()
に引き渡す
-
family
引数からフォントファミリー名を呼び出す
例示
フォントをパッケージに登録する
{extrafont}
内にローカル上のTTFファイルのデータベースを作成するwindowsFonts()
に引き渡すfamily
引数からフォントファミリー名を呼び出すフォントをパッケージに登録する
ローカルのTTFファイルを{extrafont}
に把握させます。
この作業は初回(または新フォント導入毎)に行います。
2回目以降はフォント情報に変更がない限り不要です。
# install.packages("extrafont")
library(extrafont)
extrafont::font_import()
extrafont::loadfonts()
パッケージで認識されたフォントの確認
fonttable()
を使うとフォントファミリー名などが確認できます。
RStudioを使っている場合は、View()
に渡すと見やすいです。
# fonttable()
View(extrafont::fonttable())
先頭5行だけ表示すると、こんな感じです。
package | afmfile | fontfile | FullName | FamilyName | FontName | Bold | Italic | Symbol | afmsymfile |
---|---|---|---|---|---|---|---|---|---|
NA | AGENCYB.afm.gz | C:\Windows\Fonts\AGENCYB.TTF | Agency FB Bold | Agency FB | AgencyFB-Bold | TRUE | FALSE | FALSE | NA |
NA | AGENCYR.afm.gz | C:\Windows\Fonts\AGENCYR.TTF | Agency FB | Agency FB | AgencyFB-Reg | FALSE | FALSE | FALSE | NA |
NA | ALGER.afm.gz | C:\Windows\Fonts\ALGER.TTF | Algerian | Algerian | Algerian | FALSE | FALSE | FALSE | NA |
NA | ariblk.afm.gz | C:\Windows\Fonts\ariblk.ttf | Arial Black | Arial Black | Arial-Black | FALSE | FALSE | FALSE | NA |
NA | arialbi.afm.gz | C:\Windows\Fonts\arialbi.ttf | Arial Bold Italic | Arial | Arial-BoldItalicMT | TRUE | TRUE | FALSE | NA |
フォント情報をwindowsFonts()へ引き渡す
上記のフォント情報は{extrafont}
パッケージに記録されたものです。これをアウトプットに用いる場合、windowsFonts
に引き渡さなくてはなりません。ここで用いるのがextrafont::loadfonts()
です。
この関数にはdevice
引数があり、デフォルトではpdf
となっています。これをwin
とするとwindowsFonts
に引き渡されます。
extrafont::loadfonts(device = "win")
引き渡されたかを確認するには、windowsFonts()
を実行します。実行するとリスト型データを返してくれますが、その際names()
で括ったほうがスマートに見れます。
names(windowsFonts())
[1] "serif" "sans"
[3] "mono" "Agency FB"
[5] "Algerian" "Arial Black"
[7] "Arial" "Arial Narrow"
[9] "Arial Rounded MT Bold" "Bahnschrift"
[11] "Baskerville Old Face" "Bauhaus 93"
[13] "Bell MT" "Berlin Sans FB"
[15] "Berlin Sans FB Demi" "Bernard MT Condensed"
family引数で指定する
これでggplotで使える状態になりました。フォントを操作するにはtheme()
の中でelement_text(family = "フォントファミリー名")
で指定します。
ggplot(iris, aes(x = Sepal.Length, y = ..density..)) +
geom_histogram(position = "dodge", alpha=0.9, fill = "#E81F5D", colour = "#4D1336") +
geom_density(alpha = 0.5, fill = "#4D1336", colour = "#4D1336", size = 0.5, n = 40000) +
geom_vline(xintercept = 0, linetype = 1) +
ggtitle("度数分布図:Sepal Length") +
theme(plot.title = element_text(hjust = 0.5))+
theme(plot.title = element_text(family = "Yu Mincho", size = 11),
axis.title.x = element_text(family = "Goudy Old Style", size = 11),
axis.title.y = element_text(family = "Goudy Old Style", size = 11),
axis.text.x = element_text(family = "Goudy Old Style", size = 11),
axis.text.y = element_text(family = "Goudy Old Style", size = 11))
万が一「Windows のフォントデータベースにフォントファミリが見付かりません」の警告が出る場合は、フォントファミリ―名の指定が正しくない可能性がありますので再度確認しましょう。
それ以外の警告文はスルーしてもOKですが、気になる方は一旦Rを再起動すると出なくなるようです。
ちなみに
- Rを再起動すると
windowsFonts()
に登録されたフォントファミリ―情報はリセットされますが、{extrafont}
に格納された情報は保持されます。
-
library(extrafont)
を実行すると同時にloadfonts()
が実行されるため、windowsFonts()
への登録作業も不要になります。つまり2回目以降は、library(extrafont)
実行後、直ちに{ggplot2}
による描写が可能です。
-
{extrafont}
はTTF
形式のみ対応しています。游ゴシックのようなTTC
形式の場合はTTF
形式に分解する(自己責任)か、{showtext}
パッケージを利用します。
おわりに
windowsFonts()
に登録されたフォントファミリ―情報はリセットされますが、{extrafont}
に格納された情報は保持されます。library(extrafont)
を実行すると同時にloadfonts()
が実行されるため、windowsFonts()
への登録作業も不要になります。つまり2回目以降は、library(extrafont)
実行後、直ちに{ggplot2}
による描写が可能です。
{extrafont}
はTTF
形式のみ対応しています。游ゴシックのようなTTC
形式の場合はTTF
形式に分解する(自己責任)か、{showtext}
パッケージを利用します。これで違和感なく図表を文書に貼り付けられます。
やったね。
Enjoy!
おしまい。
参考文献
Author And Source
この問題について(【ggplot2】 好きなフォントを適用できるようにする), 我々は、より多くの情報をここで見つけました https://qiita.com/zakkiiii/items/9bbfdaf46a097677205d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .