matplotlib.pyplotの日本語化


Pythonを使っていると、matplotlibにお世話になることも多いと思いますが、素のままで日本語を設定すると正常に表示されません。

Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3,4])
[<matplotlib.lines.Line2D object at 0x0000025E02C024F0>]
>>> plt.ylabel('日本語ラベル')
Text(0, 0.5, '日本語ラベル')
>>> plt.show()

このあたり、先輩諸氏もいろいろと苦労されているようで、下記記事を参考にさせていただきました。


以下、Windows環境、Linux環境の両方で確認した方法です。

環境

Windows

  • Windows10 Build 18363.959
  • Python 3.8.5
  • matplotlib 3.3.0

Linux

  • Ubuntu 20.04 LTS
  • Python 3.8.5
  • matploplib 3.3.0

手順

1. matplotlibで利用可能な日本語フォントを探す。

>>> from matplotlib import font_manager
>>> for i in font_manager.fontManager.ttflist:
...     if ".ttc" in i.fname:
...             print(i)
...
  • if ... in ...print(i)の行でインデントを忘れずに。
    結果として<Font ~>の形式で利用可能なフォントが表示されます。
    一行も表示されない場合、日本語フォントが使えない状態ですので、別途日本語フォントをインストールする必要があります。
    基本的には、システム(OS)のフォントを使っているので、日本語対応しているOSで使っていれば大丈夫と思いますが。。。

  • フォント関連は勉強不足甚だしいので、大雑把な理解ですが、

    • フォントファイルのサイズが小さいものは「英数記号のみ」、大きいものは「英数記号以外のフォントも含まれる」(文字の種類が増えれば、フォントのデータも増える)
    • 拡張子が、".ttc"なら複数のフォントが含まれているので日本語フォントも入っている場合がある。

2. matplotlib.rcで日本語フォントを指定する。

上記手順で見つかったフォント情報の「Font」の直後にある、シングルクオーテーション(')で囲まれた文字を指定します。

  • Windowsの例
>>> import matplotlib
>>> matplotlib.rc('font', family='BIZ UDGothic')
  • Linuxの例
>>> import matplotlib
>>> matplotlib.rc('font', family='Noto Sans CJK JP')

この例ではどちらもゴシック系の文字を指定しています。明朝系なら'BIZ UDMincho'(Windows)、'Noto Serif CJK JP'(Linux)を指定します。

3. 確認

再度、グラフを表示させてみます。

>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3,4])
[<matplotlib.lines.Line2D object at 0x0000029065E6DA30>]
>>> plt.ylabel('日本語ラベル')
Text(0, 0.5, '日本語ラベル')
>>> plt.show()

無事、日本語表示できました。

4. 確認 その2

その他の箇所も日本語化できるか確認しました。

matplotlib_japanese.py
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rc('font', family='BIZ UDGothic')

plt.bar([1, 2], [5, 10], 0.25)
plt.bar([1.25, 2.25], [4, 8], 0.25, color='darkorange')
plt.xlim((0.75, 2.75))
plt.ylim((0, 12))

plt.title(u'タイトル - abc')
plt.xlabel(u'X軸')
plt.ylabel(u'Y軸')
plt.text(2.125, 10, u'テキスト1', ha='center')
plt.annotate(u'アノテーション Annotate', xy=(1.125, 5), xytext=(1.3, 8), arrowprops=dict(facecolor='k', shrink=0.05))
plt.legend([u'凡例は', 'HanRei'], loc='upper left')
plt.show()

コードの元はこちらからお借りしました。感謝。

うまくいきました。