[Python]Matplotlibで任意の日本語フォントを表示する。

## 今さらこの記事を書く意義は？

これまでも同様の無いようでQiitaにも多数の記事が投稿され、Webでも検索すれば、数えきれないほどの資料が見つかりますが、あえて少し視点を変えて、解説させていただきます。

ここでは、特に[Google Colaboratory](https://colab.research.google.com)と[Watson Studio](https://dataplatform.cloud.ibm.com/)という、基本的にデータを永続化出来ない環境での[Matplotlib](https://matplotlib.org/)を想定した日本語フォントを導入方法を紹介します。

Google Colaboratoryに関しては、Androidのユーザーであれば必ずと言っていいほど登録済みのGooleアカウントでサイトにアクセスして、利用規約に同意するだけで容易に新規ノートブックを作成していただけます。

[IBM Cloud](https://cloud.ibm.com/)に関しては、アカウントお持ちで無い方が多いとは思いますが、サインアップは済んでいるものとして進めさせていただきます。

始めに、ご存じ無い方のためにWatson Studioを開始するまでの手順をかいつまんで解説しておきます。まずはログイン後のダッシュボードの画面の右上にある**リソースの追加**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/44a8b64e-0585-19ac-c015-962b5b3c0a46.png)

次のカタログの画面で、左側の**カテゴリー**のリストから**AI / Machine Learning**を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/51e2c890-5277-c01c-92c0-9c95c307e4d7.png)

次のページで目的の**Watson Studio**が選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/c6a685dd-b992-1573-51d1-16f12453ad9f.png)

作成画面に遷移しますと、任意でロケーションを変更可能ですが、右下の**使用条件**に同意さえすれば、無料プランで作成ボタンがクリック出来るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/0e79dd6f-77c4-7747-4a00-a79aac543320.png)

サービスが作成され、ページが変わったら、**Launch in Cloud Pak for Data**というボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/beb5588a-4c18-355e-4190-ede3d426de90.png)

**ようこそ**の画面になりますので、新規にプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/e0c3a5ba-0bdf-9512-8575-d3fdbbb39208.png)

**プロジェクトの作成**では、差し当たり空のプロジェクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/02b0d936-c698-ee80-514f-2a761dbfafa1.png)

次は任意のプロジェクト名を入力すれば、作成ボタンがアクティブになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/65277ac9-5589-2654-5d74-15ab97f86cef.png)

プロジェクトのトップページが表示されたら、**プロジェクトに追加**ボタンで**資産タイプの選択**が出現されるので**Notebook**を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/d177a9f1-032f-1cf1-20e3-d5be00512b1e.png)

後はNotebook名を入力するだけです。ランタイムは特に高いスペックを必要としないのであれば、低いスペックにしておいたほうが、稼働時間を長くできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/a817fa42-8a46-c922-2bc4-d8d171d80130.png)

白紙のNotebookが表示されたら準備完了です。お疲れさまでした。早速コードを入力して実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/50058e52-14ed-c373-7228-cb1bfc227d20.png)


## まず日本語フォント未登録だと、どうなるか．．．

単なるサンプルなので意味の無いデータですが、今回は以下のコードをセルに入力し、グラフを表示します。

```python
import numpy as np
x = np.arange(-np.pi, np.pi, 0.25)

from matplotlib import pyplot as plt
plt.plot(x, np.sin(x), marker='o', label=u'sinカーブ', color='gray')
plt.plot(x, 2*np.sin(x), marker='x', label=u'sin2カーブ', color='red')
plt.plot(x, np.cos(x), marker='.', label=u'円周率π', color='blue')
plt.xlabel(u'スケール')
plt.ylabel(u'ラジアン')
plt.legend()
plt.figtext(x=0, y=0, s=u'三角関数')
plt.grid(axis='x', color='pink', alpha=0.5, linewidth=1, linestyle='--')
plt.grid(axis='y', color='cyan', alpha=0.5, linewidth=1, linestyle=':')
```

すると大量のエラーが出力された後、全角のフォントがいわゆる「豆腐」の状態となり、それぞれ以下のように表示されます。

**Google Colaboratory**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/9561e662-61fe-a3fb-b013-99abf2b7417a.png)

**Watson Studio**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/53172909-d116-bccc-cf68-6b97378b4b0b.png)

## Plotに日本語フォントを一括適用する

日本語フォントはそれぞれ好みのものを選択して構いませんが、ここでは直接リンクからZipファイルをダウンロードできる[Source Han Code JP](https://github.com/adobe-fonts/source-han-code-jp)を採用します。

まず下記のコードでダウンロードしてから、目的のファイルを抽出し保存します。

```python
import requests
from zipfile import ZipFile
from io import BytesIO
from matplotlib import font_manager as fm

font_url = 'https://github.com/adobe-fonts/source-han-code-jp/archive/2.011R.zip'
font_zip = requests.get(font_url)
font_set = BytesIO(font_zip.content)
font_path = 'source-han-code-jp-2.011R/OTF/SourceHanCodeJP-Regular.otf'
ZipFile(font_set, 'r').extract(font_path)
font_set.close()
```

さらに、フォントファイルを`font_manager`に登録した上で、`matplotlib.pyplot`に既定のフォントとして一括適用します。
手っ取り早く日本語フォントを表示するためだけであれば、これでよいのではないかと思います。

```python
from matplotlib import pyplot as plt, font_manager as fm
fm.fontManager.addfont(font_path)
font_prop = fm.FontProperties(fname=font_path)
plt.rc('font', family=font_prop.get_name())
```

## 実際に日本語フォントを表示してみる。

準備が出来たところで、冒頭のコードを同じように実行すると、それぞれ以下のように表示されます。

**Google Colaboratory**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/1fbf205c-73cb-4b69-f184-e64fd95a5542.png)

**Watson Studio**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/a7db5fc2-799d-396d-46fc-1b85d69efc80.png)

## 個別にフォントの設定を調整する場合

グラフの見栄えにこだわるのであれば、`font_properties`というパラメータに`matplotlib.font_manager.FontProperties`を渡すことにより、個別にフォントを調整することが出来ます。
下記にフォントのサイズや太さを変更するサンプルを示します。

```python
x = np.arange(-np.pi, np.pi, 0.25)
plt.plot(x, np.sin(x), marker='o', label='sinカーブ', color='gray')
plt.plot(x, 2*np.sin(x), marker='x', label='sin2カーブ', color='red')
plt.plot(x, np.cos(x), marker='.', label='円周率π', color='blue')
font_prop.set_size(12.0)
plt.xlabel('スケール', font_properties=font_prop)
plt.ylabel('ラジアン', font_properties=font_prop)
font_prop.set_size(18.0)
font_prop.set_weight('extra bold')
plt.figtext(x=0, y=0, s='三角関数', font_properties=font_prop)
plt.grid(axis='x', color='pink', alpha=0.5, linewidth=1, linestyle='--')
plt.grid(axis='y', color='cyan', alpha=0.5, linewidth=1, linestyle=':')
font_prop.set_size(9.0)
font_prop.set_weight('ultralight')
plt.legend(prop=font_prop)
```

**Google Colaboratory**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/0fe6e6df-d1b2-4155-bbc7-92586d63d23a.png)

**Watson Studio**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513692/9f6dccbf-5ed4-0d71-962f-0e0d8464d512.png)


## 終わりに

毎回、フォントファイルの入手からの作業となることを念頭に、出来るだけ小さいオーバーヘッドで、かつ汎用的に利用出来るコードとなるよう、配慮したつもりです。

実際のところ、普段は下記の記事に書いているように[Google Cloud Shell](https://console.cloud.google.com/)で[Jupyter Lab](https://github.com/jupyterlab/jupyterlab)を利用しています。

https://qiita.com/Q-Lazy/items/ef61ce36b3f47ade91fd

そのためGoogle ColaboratoryもWatson Studioも最近はほとんどアクセスすることがありません。今回の記事を書くために久々に利用したので、少し新鮮に感じられました。