結論
以下のコードをJupyter Notebook上で実行すれば、matplotlibによるグラフ描画が日本語でできるようになる。
なお、通常のPythonファイル(.py
)でも利用できる。
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 日本語に対応したファイルのパスを指定する
font_path = r"C:\Windows\Fonts\msgothic.ttc"
font_props = font_manager.FontProperties(fname=font_path)
plt.rcParams["font.family"] = font_prop.get_name()
(Windowsでの実行を想定。ほかのOSであったり、異なるフォントを利用したい場合は、font_path
で別のファイルパスを指定すればよい。)
Python / Jupyter Notebookでjapanize-matplotlibが使えない?
PythonおよびJupyter Notebookでmatplotlibを利用してグラフを描画するとき、日本語がグラフのラベルや項目名に入っていると、文字化けしてしまう。
そんな問題を解決してくれるのがjapanize-matplotlibであるわけだが、どうも以下のエラーが出て利用できないようであった。
import japanize_matplotlib
# >> ModuleNotFoundError: No module named 'distutils'
実行環境は、
- Python ->3.12.3
- matplotlib -> 3.10.3
- japanize-matplotlib -> 1.1.3
である。
「distutils
というモジュールはありませんよーー」というエラーが出た。
使用しているPythonのバージョンは3.12.3である。
おそらくjapanize_matplotlibが内部的に利用しているモジュールであろうが、調べてみることにした。
distutilsとは?
distutilsというのは、簡単にいうと元々Pythonのライブラリのビルドやパッケージ化、インストールに使われていたモジュールである。
以下にPython 3.9のときの公式のドキュメントがあった。
なお、このモジュールは非推奨となり、Python 3.10で廃止(Deprecated)され、Python 3.12から完全に削除された。
代替として、setuptoolsが使われるようになった。
setuptoolsについては、ここでは割愛する。
japanize-matplotlibがdistutils
モジュールを利用していることは、Gitのレポジトリを参照すればわかる。
コードの中身を見てみると、matplotlibのバージョンに応じて、フォント適用の方法を分けているのがわかる。
その処理自体は問題ないが、問題点は、バージョン比較にdistutils.version.LooseVersion
を利用していることである。
ここが原因で、distutils
モジュールが削除された環境でjapanize-matplotlibが結果として利用できないといった次第である。
japanize-matplotlibをインストールして、パッケージインストール先にあるjapanize-matplotlib.py
を直接変更してしまうのもよいが、上級者向けであまりお勧めはしない。
解決策:matplotlibのフォント設定を直接変更する
上記のリンクを参照していただければわかるが、japanize-matplotlibのGitレポジトリにあるjapanize-matplotlib.py
を見ると、どうやらmatplotlibにはフォント変更をするモジュールがあるようだ。以下の箇所を見るとわかる。
from matplotlib import font_manager
matplotlibには、font_manageer
というものがあり、matplotlibによるグラフ描画の際に利用するフォントを指定することができる。
ここに公式の説明がある。
結論として、matplotlibのフォントを日本語対応のものに指定すれば、それでmatplotlibを日本語化することができる。
結論のコード:
# 必要なモジュールをインポート
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 日本語に対応したファイルのパスを指定する
font_path = "(フォントファイルのあるパス)" # <- 以下に例を掲載
font_props = font_manager.FontProperties(fname=font_path)
plt.rcParams["font.family"] = font_prop.get_name()
以下、コードの処理を順番に解説していく。
手順
1. 必要なモジュールをインポート
from matplotlib import pyplot as plt
from matplotlib import font_manager
pyplotにフォント設定を適用するので、pyplotもインポートする。
2. フォントファイル(tff
やttc
)のパスをfont_path
に格納
例えば、Windowsではmsgothic.ttc
というフォントファイルが、一般的にはC:\Windows\Fonts\msgothic.ttc
というパスにあるので、
font_path = r"C:\Windows\Fonts\msgothic.ttc"
と指定する。
フォントファイルを別途入手して指定するのもよい。
3. フォントファイルオブジェクトを作成
font_props = font_manager.FontProperties(fname=font_path)
font_path
で指定されたファイルから、フォント情報を持つオブジェクトを生成する。
4. 3で作成したフォントオブジェクトをpyplotに適用する
plt.rcParams["font.family"] = font_props.get_name()
rcParams
とは、matplotlibのグローバル設定を格納しているdict
型のオブジェクトで、そのうちfont.family
にフォント名を指定すればよい。
なお、font_props
はフォントオブジェクトであるが、このオブジェクトにはフォント名を取得できるget_name()
メソッドがあるため、これでフォント名を指定しているといった具合である。
最後に
japanize-matplotlibが使えなくなったとき、まったく解決策が思い浮かばず、路頭に迷っていた。しかし、意外にも簡単に解決できたので、ここで共有しておく。
なお、現在(2025/05/22)のところ、PyPlにmatplotlib_fontja
というライブラリがあり、これを導入するだけで日本語化できるとのこと。
コマンドプロンプトなどで
pip install matplotlib-fontja
としてパッケージを導入し、使用したいNotebookやPythonスクリプトに
import matplotlib_fontja
を入れるだけで、簡単にmatplolibを日本語化することができる。
以下をご参考に。
ただし、導入が面倒であれば、以上のような手動による方法を試してみるとよいだろう。
最後まで読んでいただき、ありがとうございました。まだまだ知識は浅い方なので、疑問や問題点などありましたらコメント欄でお願いします。