【ggplot2】 好きなフォントを適用できるようにする


趣旨

可視化したデータを書類に貼り付ける際、図表内のフォントと書類のフォントは統一させておきたいものです。
そんな時に使える技を備忘録として記しておきます。

環境

  • Windows x64
  • フォントファイルはTTF形式で用意

あくまでWindows向けの記事です。
Macは仕様が微妙に違うらしいので参考になるとは限りません。

おおまかな流れ

  1. {extrafont}内にローカル上のTTFファイルのデータベースを作成する
  2. 登録したフォントをwindowsFonts()に引き渡す
  3. 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}パッケージを利用します。

おわりに

これで違和感なく図表を文書に貼り付けられます。
やったね。

Enjoy!

おしまい。

参考文献