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

# 趣旨

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

# 環境
- Windows x64
- フォントファイルは`TTF`形式で用意

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

# おおまかな流れ

1. `{extrafont}`内にローカル上のTTFファイルのデータベースを作成する
2. 登録したフォントを`windowsFonts()`に引き渡す
3. `family`引数からフォントファミリー名を呼び出す

# 例示
## フォントをパッケージに登録する
ローカルのTTFファイルを`{extrafont}`に把握させます。
この作業は初回（または新フォント導入毎）に行います。
2回目以降はフォント情報に変更がない限り不要です。

```R
# install.packages("extrafont")
library(extrafont)
extrafont::font_import()
extrafont::loadfonts()
```

## パッケージで認識されたフォントの確認
`fonttable()`を使うとフォントファミリー名などが確認できます。
RStudioを使っている場合は、`View()`に渡すと見やすいです。

```R
# fonttable()
View(extrafont::fonttable())
```

先頭5行だけ表示すると、こんな感じです。

<table>
 <thead>
  <tr>
   <th style="text-align:left;"> package </th>
   <th style="text-align:left;"> afmfile </th>
   <th style="text-align:left;"> fontfile </th>
   <th style="text-align:left;"> FullName </th>
   <th style="text-align:left;"> FamilyName </th>
   <th style="text-align:left;"> FontName </th>
   <th style="text-align:left;"> Bold </th>
   <th style="text-align:left;"> Italic </th>
   <th style="text-align:left;"> Symbol </th>
   <th style="text-align:left;"> afmsymfile </th>
  </tr>
 </thead>
<tbody>
  <tr>
   <td style="text-align:left;"> NA </td>
   <td style="text-align:left;"> AGENCYB.afm.gz </td>
   <td style="text-align:left;"> C:\Windows\Fonts\AGENCYB.TTF </td>
   <td style="text-align:left;"> Agency FB Bold </td>
   <td style="text-align:left;"> Agency FB </td>
   <td style="text-align:left;"> AgencyFB-Bold </td>
   <td style="text-align:left;"> TRUE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> NA </td>
  </tr>
  <tr>
   <td style="text-align:left;"> NA </td>
   <td style="text-align:left;"> AGENCYR.afm.gz </td>
   <td style="text-align:left;"> C:\Windows\Fonts\AGENCYR.TTF </td>
   <td style="text-align:left;"> Agency FB </td>
   <td style="text-align:left;"> Agency FB </td>
   <td style="text-align:left;"> AgencyFB-Reg </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> NA </td>
  </tr>
  <tr>
   <td style="text-align:left;"> NA </td>
   <td style="text-align:left;"> ALGER.afm.gz </td>
   <td style="text-align:left;"> C:\Windows\Fonts\ALGER.TTF </td>
   <td style="text-align:left;"> Algerian </td>
   <td style="text-align:left;"> Algerian </td>
   <td style="text-align:left;"> Algerian </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> NA </td>
  </tr>
  <tr>
   <td style="text-align:left;"> NA </td>
   <td style="text-align:left;"> ariblk.afm.gz </td>
   <td style="text-align:left;"> C:\Windows\Fonts\ariblk.ttf </td>
   <td style="text-align:left;"> Arial Black </td>
   <td style="text-align:left;"> Arial Black </td>
   <td style="text-align:left;"> Arial-Black </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> NA </td>
  </tr>
  <tr>
   <td style="text-align:left;"> NA </td>
   <td style="text-align:left;"> arialbi.afm.gz </td>
   <td style="text-align:left;"> C:\Windows\Fonts\arialbi.ttf </td>
   <td style="text-align:left;"> Arial Bold Italic </td>
   <td style="text-align:left;"> Arial </td>
   <td style="text-align:left;"> Arial-BoldItalicMT </td>
   <td style="text-align:left;"> TRUE </td>
   <td style="text-align:left;"> TRUE </td>
   <td style="text-align:left;"> FALSE </td>
   <td style="text-align:left;"> NA </td>
  </tr>
</tbody>
</table>


## フォント情報をwindowsFonts()へ引き渡す
上記のフォント情報は`{extrafont}`パッケージに記録されたものです。これをアウトプットに用いる場合、`windowsFonts`に引き渡さなくてはなりません。ここで用いるのが`extrafont::loadfonts()`です。
この関数には`device`引数があり、デフォルトでは`pdf`となっています。これを`win`とすると`windowsFonts`に引き渡されます。

```R
extrafont::loadfonts(device = "win")
```

引き渡されたかを確認するには、`windowsFonts()`を実行します。実行するとリスト型データを返してくれますが、その際`names()`で括ったほうがスマートに見れます。

```R
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 = "フォントファミリー名")`で指定します。

```R
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))
```

![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551476/3367f52c-53fa-5dad-00c8-0c3f65df68aa.png)


万が一**「Windows のフォントデータベースにフォントファミリが見付かりません」**の警告が出る場合は、フォントファミリ―名の指定が正しくない可能性がありますので再度確認しましょう。
それ以外の警告文はスルーしてもOKですが、気になる方は一旦Rを再起動すると出なくなるようです。


# ちなみに

- Rを再起動すると`windowsFonts()`に登録されたフォントファミリ―情報はリセットされますが、`{extrafont}`に格納された情報は保持されます。
- `library(extrafont)`を実行すると同時に`loadfonts()`が実行されるため、`windowsFonts()`への登録作業も不要になります。つまり**2回目以降は、`library(extrafont)`実行後、直ちに`{ggplot2}`による描写が可能です。**
- `{extrafont}`は`TTF`形式のみ対応しています。游ゴシックのような`TTC`形式の場合は`TTF`形式に分解する（自己責任）か、<a href ="https://cran.rstudio.com/web/packages/showtext/vignettes/introduction.html">`{showtext}`パッケージ</a>を利用します。




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

Enjoy!

おしまい。

# 参考文献
- [https://cran.r-project.org/web/packages/extrafont/README.html](https://cran.r-project.org/web/packages/extrafont/README.html)
- [須通り_統計_Rにおける作図時のフォント設定を極める](https://sudori.info/stat/stat_fig_font.html)