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

>>> import matplotlib.pyplot as plt
>>> x = [1, 2, 3, 4, 5]
>>> y = [1, 4, 9, 16, 25]
>>> plt.plot(x, y)
>>> plt.title("二乗値のグラフ")
>>> plt.show()

いわゆる「豆腐文字」と呼ばれるものです。

tofu font

文字化けすると、シェルには以下のような警告(Warning)が文字数の分だけ表示されます。

.....
Warning (from warnings module):
  File "C:\Users\Ichiro\AppData\Local\Programs\Python\Python37-32\lib\site-packages\matplotlib\backends\backend_agg.py", line 180
    font.set_text(s, 0, flags=flags)
RuntimeWarning: Glyph 12501 missing from current font.

今回はMatplotlibの日本語文字化けの簡単な解決方法をご紹介します。この問題解決には様々な方法がありますが、Windowsではこの方法が恐らく最も簡単だと思います。ぜひ参考にしてください。

本記事では、matplotlib3.1.0 + Windows10で確認しています。matplotlibはAnacondaではなくpipでインストールしています。
本記事の目次

タイトルや軸ラベルの場合

タイトルや軸ラベルに日本語を使う場合は、以下のようにキーワード引数を用いてfontname=に日本語のフォント名を指定するだけです。

>>> plt.plot(x, y)
>>> plt.title("二乗値のグラフ", fontname="MS Gothic")
>>> plt.show()

ここでは、Windowsで「MSゴシック(MS Gothic)」を指定しています。

matplotlib japanese font

軸のラベルも同様に指定できます。

>>> plt.plot(x, y)
>>> plt.xlabel("X軸", fontname="MS Gothic")
>>> plt.ylabel("Y軸(二乗値)", fontname="MS Gothic")
>>> plt.show()

matplotlib label

凡例(legend)の場合

凡例でも同じようにfontname=でフォントを指定すると以下のようにエラーになります。

>>> plt.plot(x, y)
>>> plt.legend(["二乗値)"], fontname="MS Gothic")
....
TypeError: __init__() got an unexpected keyword argument 'fontname'

凡例の場合は、以下のようにprop=familyをキーとする辞書でフォントを指定すると、問題なく日本語を表示できます。

>>> plt.plot(x, y)
>>> plt.legend(["二乗値"], prop={"family":"MS Gothic"})
>>> plt.show()

使えるフォントの調べ方

Windowsでは、通常は以下のような一般的なフォントが使えます。

MS GothicMS MinchoHGGothicMHGMinchoBHGGothicEHGMinchoEなど、

どのようなフォント名が使えるかは、以下のファイルをメモ帳で開いて確認できます(ファイル名の部分はmatplotlibのバージョンで異なります)。

 C:/Users/<ユーザ名>/.matplotlib/fontlist-v310.json

以下のnameの部分を、フォント名(fontname)として使用できます。

fonts list

その他の使用例

以下のヒストグラムの作成では、Windows10で「遊ゴシック(Yu Gothic)」を指定しています。

データ分析で最初に行うことは、項目(変数)ごとに平均、標準偏差、ヒストグラムを知ることです。なかでも、ヒストグラムは「値の分布傾向」を視覚的に把握できるので重宝します。 例えば、今まで左右対称な…