matplotlibで日本語フォントを使う色々な方法

動作確認に使用したバージョンはPython 3.10.6

OSにインストールされたフォントを使用する

フォントのインストール

適当に日本語フォントをインストールする。

$ sudo apt install fonts-noto-cjk

インストールされたフォントを使用する場合、matplotlibから認識されているフォント名称で指定する必要がある為、初めて使用するフォントの名称を確認しておく必要がある。

フォント名称は以下のコードを実行すると一覧を得ることができる。

>>> import matplotlib
>>> from matplotlib import font_manager as fm
>>> from matplotlib.font_manager import FontProperties as props
>>> 
>>> font_list = [props(fname=font).get_name() for font in fm.findSystemFonts()]
>>> 
>>> for name in sorted(set(font_list)):
>>>     print(name)

フォントを使用するスクリプトで実行する必要はない。あくまでフォント名称を確認するために使用する。

使用するフォントを指定する

デフォルトで使用するフォントを指定する場合、設定ファイルで以下の様に指定する。

$ vim ~/.config/matplotlib/matplotlibrc
font.family: "Noto Serif CJK JP"

出力するスクリプトやグラフごとに変更したい場合は、スクリプト内で指定する必要がある。

>>> import matplotlib
>>> 
>>> matplotlib.rcParams["font.family"] = "Noto Serif CJK JP"

フォントをOSにインストールせず使用する

ダウンロードしてきたフォントファイルなどをインストールせずに使いたい場合、ファイルパスで指定する方法もある。

この場合、フォントを設置しているパスをフォントマネージャに登録して使用可能な状態にしたあとファイルパスで指定する。

例えば、カレントディレクトリにある./font.ttfを使用したい場合は以下の様になる。

>>> import os
>>> import matplotlib
>>> from matplotlib import font_manager as fm
>>> from matplotlib.font_manager import FontProperties as props
>>> 
>>> def register_font(path):
>>>     for font in fm.findSystemFonts(fontpaths=os.path.dirname(path)):
>>>         fm.fontManager.addfont(font)
>>> 
>>> def set_font_by_path(font_path):
>>>     register_font(font_path)
>>>     matplotlib.rcParams["font.family"] = props(fname=font_path).get_name()
>>> 
>>> set_font_by_path('./font.ttf')

not found...

findfont: Font family 'Noto Serif CJK JP' not found.などと表示される場合はキャッシュが悪さをしている可能性がある。

キャッシュディレクトリは以下のコードで知ることができ、この中にあるfontlist*.jsonを削除する。

$ python3 -c 'import matplotlib; print(matplotlib.get_cachedir())'