matplotlibの日本語化(フォント変更)

matplotlibで日本語を表示しようとすると以下のように文字化けしてしまう。

import matplotlib.pyplot as plt
plt.plot(list(range(10)), list(range(10)))
plt.title('日本語タイトル')

f:id:ricrowl:20200914013415p:plain

これはmatplotlibで使っているフォントが日本語に対応していないからなので対応しているフォントを使うようにしてやる。

ちなみに今使っているフォントはplt.rcParams['font.family']を出力して確認できる。

フォントの取得

日本語対応したフォントを外部サイトから取得する。
情報処理推進機構がフォントを公開してくれている(DLリンク)。

ライセンスも商用・非商用が可なので使用しやすい。以下IPAexフォント Ver.004.01のライセンスから抜粋。

6.受領者は、3条2項の定めに従い、商用・非商用を問わず、許諾プログラムをそのままの状態で改変することなく複製して第三者への譲渡し、公衆送信し、その他の方法で再配布することができます(以下、「再配布」といいます。)。

ダンロードしたzip内のipaexg.ttfを使用する。

フォントをmatplotlibに追加

matplotlibのパッケージデータにipaexg.ttfを加える。

まず、plt.rcParams['datapath']を出力してパッケージデータが保存されているディレクトリを確認する。
おそらく.../matplotlib/mpl-dataのような構造となっている。

次に.../matplotlib/mpl-data/fonts/ttfにipaexg.ttfを追加する。自分の環境では以下のようにした。

cp ipaexg.ttf /opt/conda/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/

フォントをデフォルトとして登録

追加したフォントをmatplotlibのデフォルトとして登録する。

.../matplotlib/mpl-data/matplotlibrcの以下の部分を編集する。
編集前

# font.family         : sans-serif

編集後

font.family         : IPAexGothic

キャッシュを削除

matplotlibのフォントのキャッシュデータがあると追加したフォントが認識されないので削除する。

まず、以下のようにしてキャッシュデータのディレクトリを確認する。

import matplotlib 
print(matplotlib.get_cachedir())

おそらく.../.cache/matplotlibのような構造となっている。

次に.../.cache/matplotlib/下にfontがつくファイルがある(例えばfontlist-v300.jsonみたいな)ので全て削除する。自分の環境では以下のようにした。

rm /root/.cache/matplotlib/font*

プロット再確認

pythonやjupyterを再起動して冒頭と同じものをプロットしてみる。

import matplotlib.pyplot as plt
plt.plot(list(range(10)), list(range(10)))
plt.title('日本語タイトル')

f:id:ricrowl:20200914024846p:plain

日本語で表示できるようになった。

参考:一時的にフォントを変えたいだけのとき

matplotlibのデフォルトのフォントはそのままで一時的にだけ変えたい場合は以下2通りの方法がある。

特定のスクリプトだけフォントを変えたいとき

このスクリプトだけ日本語化したいなーというときはこっち。

スクリプトのはじめにplt.rcParams['font.family']を変更する。

plt.rcParams['font.family'] = 'IPAexGothic'

以下、ずっと変更したフォントで表示される。

特定の図だけフォントを変えたいとき

この図だけ日本語化したいなーというときはこっち。

変更したいフォントのFontPropertiesを作成し、pltの引数に加える。

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
font_path = '/opt/conda/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/ipaexg.ttf'
fp = fm.FontProperties(fname=font_path)
plt.plot(list(range(10)), list(range(10)))
plt.title('日本語タイトル', fontproperties=fp)
plt.text(5, 5, 'デフォルトの日本語タイトル')

f:id:ricrowl:20200914030101p:plain

plt.text(5, 5, 'デフォルトの日本語タイトル')はデフォルトのフォントのままで文字化けしているけど、plt.title('日本語タイトル', fontproperties=fp)は日本語化できている。

さらにこの方法ではフォントのディレクトリはどこでもOK。

参考:フォント名を確認する方法

今回ipaexg.ttfはIPAexGothicというフォント名だったけどファイル名からは名前がわからない。

そんなときはmatplotlibのフォントのキャッシュデータを見ると名前が書いてある。
自分の環境では/root/.cache/matplotlib/fontlist-v300.jsonを確認すると以下の部分が確認がある。

    {
      "fname": "fonts/ttf/ipaexg.ttf",
      "name": "IPAexGothic",
      "style": "normal",
      "variant": "normal",
      "weight": 400,
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },

ここの"name"からIPAexGothicとわかる。

※キャッシュデータはフォント追加後に削除したあとのもの