いっしきまさひこBLOG

AI・機械学習関連、Web制作関連、プログラミング関連、旅行記録などなど。一色政彦。

matplotlibのグラフで日本語を使う手法まとめ

問題と、この記事の目的

matplotlibのグラフを描画するときにタイトルや凡例などに日本語を使うと、次のように通常は文字化けしてしまいます(豆腐□になる)。

f:id:misshiki:20180815145120p:plain

これを回避して次のように日本語で表示する方法を、自分用の備忘録として、また他の人の参考用に、まとめておきます。

f:id:misshiki:20180815145249p:plain

フォントを指定する方法には、主に次の3段階があります。

  • 1.【個別のフォント】を設定
  • 2. 【以下すべてのmatplotlibのフォント】をまとめて設定
  • 3.【matplotlib全体のデフォルトフォント】を設定

それぞれ説明していきます。

フォントのダウンロード

その前に必要に応じて使うフォントを、OSにインストールしておいてください。この記事では以下を使います。

1. 【個別のフォント】を設定

1の手法の利点は、必要なところだけフォントを設定できるので、より細かくカスタマイズできるところです。実行するコードは、次のようになります。なお、axaxes(figure図の中にあるグラフ本体)のことです。

# 1. 【個別のフォント】を設定できる
font = {'family': 'IPAexGothic',
        'size': 14}
ax.set_title('日本語タイトル', fontdict=font)
ax.set_xlabel('X軸', fontdict=font)
ax.set_ylabel('Y軸', fontdict=font)

ただ、この方法だと、凡例(legend)が設定できないらしい。凡例を日本語化するには、以下のようにFontPropertiesを使う必要があります。

from matplotlib.font_manager import FontProperties
fp = FontProperties(fname=r'C:\WINDOWS\Fonts\SourceHanCodeJP-Regular.otf', size=14) # 他にはipaexg.ttfフォント
ax.set_title('日本語タイトル', fontproperties=fp)
ax.legend(['凡例だけはprop=fp', 'それ以外はfontproperties=fp'], loc='upper left', prop=fp)

FontPropertiesを使うデメリットは、フォントファイルを直接扱っているので環境依存が強まる点だと思います。

2. 【以下すべてのmatplotlibのフォント】をまとめて設定

次がmatplotlibのrc(“run commands”: いわゆる実行・挙動の構成)をダイナミックに設定する方法です。あくまでダイナミックなので、その実行において一時的に適用されます。

# 2.【以下すべてのmatplotlibのフォント】をまとめて設定できる
import matplotlib
font = {'family' : 'SourceHanCodeJP-Regular',
        'size'   : 14}
matplotlib.rc('font', **font)

以下のように設定することも可能です。

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'IPAexGothic'
plt.rcParams['font.size'] = 14

1のようにすべてにフォントを設定しなくてよいので便利です。また、実行のたびにフォントを変えられるので、手法の中では一番オススメです。

3. 【matplotlib全体のデフォルトフォント】を設定

上記のように、個別に設定したり、実行ごとに設定設定すたりするのが面倒な場合は、matplotlib全体の構成を担うrcファイルで、デフォルトのフォントを設定してしまうとよいです。

これにはまず以下を実行して、matplotlibrcの場所を取得します。

# 3. 【matplotlib全体のデフォルトフォント】を設定できる
import matplotlib
# 設定ファイルの場所を取得
print(matplotlib.matplotlib_fname())
# 取得例: 'C:\Users\masa-i\Miniconda3\envs\introtensorflow\lib\site-packages\matplotlib\mpl-data\matplotlibrc'

次に、このファイルをエディターで開き、[font.family]の値を編集して保存してください。

f:id:misshiki:20180815155222p:plain

フォントはキャッシュされているらしいので、次のコードを実行して、いったん再構築しておきます。

# フォントキャッシュを再構築
matplotlib.font_manager._rebuild()

さらに、Jupyter Notebookを使っている場合は、いったんカーネルを再起動してください。これをしないと、正常にmatplotlibrcファイルの設定が反映しないようでした。

よく日本語を使う場合は、matplotlibrcファイルでデフォルトフォントを設定しておくと便利だと思います。

まとめ

以上、matplotlibの日本語設定方法をまとめました。

ネット上でたくさんヒットするのですが、情報が分散していて調べるのに苦労しました。今後もよく使う内容だと思うので、調べた内容をここにまとめ直しました。

Hope this helps.