63 Matplotlib で日本語を使う

このところ Python で小さなプログラムを書いている。 matplotlib で日本語表示したくなったが、意外と苦戦したので、メモを残しておく (また後で別のマシンで同じことをするだろう)。

参考にしたサイト

方法1: 設定をファイルに書く Mac で、とりあえず表示させるためには、 matplotlibrc に例えば次の設定を (CotEditor とか VS code とかのテキスト・エディターを使って) 書けば良い。
matplotlibrc にこの設定を書き込む
font.family: Hiragino Maru Gothic Pro
Mac には従来から、 ヒラギノフォントと呼ばれる高品質な日本語フォントが用意されていて、 matplotlib でそれを利用するように指定する、と言うことである。

matplotlibrc をどこに置くか問題となるが、 一般には Python の中で次のようなコマンドを実行して表示できる。
import matplotlib
matplotlib.get_configdir()
Mac の場合は、 ~/.matplotlib が該当するディレクトリィらしい (確かにそうなった)。

~/.matplotlib/matplotlibrc が存在しない場合は自分で新たに作ることになる。 お行儀よくやるには、
import matplotlib
matplotlib.matplotlib_fname()
で表示されるものを ~/.matplotlib/matplotlibrc にコピーして、それを変更する。 私の場合、matplotlib.matplotlib_fname()

/Users/mk/opt/anaconda3/lib/python3.9/site-packages/matplotlib/mpl-data/matplotlibrc
が表示された。そこで
設定ファイルをコピーして修正する (ターミナルで操作)
cp /Users/mk/opt/anaconda3/lib/python3.9/site-packages/matplotlib/mpl-data/matplotlibrc ~/.matplotlib
open ~/.matplotlib/matplotlibrc
(もちろん font.family: Hiragino Maru Gothic Pro を書き込む。)
として編集した (open コマンドでテキストエディットが起動するが、 ここは自分の好きなテキストエディターでやれば良い)。 コピーされる設定ファイルは実質注釈ばかりなので、 実際には、上に書いた1行だけのファイルとしても良いみたい。 そう割り切ると、次のようにすれば良いことになる。
フォントの設定のみ1行の設定ファイルを作る (ターミナルで操作)
echo font.family: Hiragino Maru Gothic Pro>~/.matplotlib/matplotlibrc

(2022/10/15追記) font.family として、 フォントの名前である Hiragino Maru Gothic Pro を指定するのが正しいのか、 良く理解できていない。次の「方法2」のところでは、 font.family はデフォールトの sans-serif のままで、 font.sans-serif の方に Hiragino Maru Gothic Pro を入れてある。 そういう方が筋が通っているように思われる。それを真似するには (font.family: Hiragino Maru Gothic Pro とするのではなく)

font.sans-serif: Hiragino Maru Gothic Pro, Yu Gothic, Meirio, Takao, IPAexGothic, IPAPGothic
とするのか?実際にこれを設定ファイルに書いたら動いた。 あるいは font.sans-serif のデフォールトを尊重して
font.sans-serif: Hiragino Maru Gothic Pro, Yu Gothic, Meirio, Takao, IPAexGothic, IPAPGothic, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
とするものか。

(2022/10/15追記) 実はある Mac で Hiragino Maru Gothic Pro ではうまく動作せず、 Hiragino sans としたらうまく行ったということが起こった。 理由が良くわからない。

(2022/10/15追記) 他の人にプログラムを配ることを考えると方法2を採用する方が良いのかも。

フォントのキャッシュのクリア     利用する前に、一度フォントのキャッシュをクリアする必要があるかもしれない (やらなくても済む場合があるが、警告が表示されたりした場合、 試しにやってみるべきだろう。副作用はないはず。)。
フォント・キャッシュはどのディレクトリィにあるか
import matplotlib
matplotlib.get_cachedir()
これで表示されたディレクトリィで、 fontList.py3k.cachefontlist-v番号.json などのファイルを探して削除する。私の場合、キャッシュ・ディレクトリィは ~/.matplotlib だったので次のように作業した。
私の場合
cd ~/.matplotlib
ls
これで fontlist-v330.json が見つかった。
rm -f fontlist-v330.json
cd -

(2022/10/15追記) ネットを見ると、 Python の中から次のようにしてキャッシュが作り直せると書いてあったりするが、 このやり方は今では使えないみたい。代替策はあるのか? 手動でキャッシュを削除するしかないのか。
import matplotlib.font_manager
matplotlib.font_manager._rebuild()

方法2: プログラム中でフォントの指定をする解決策     一方、matplotlibrc は変更せず、 プログラム中に毎回フォントの設定を書く、というやり方もある。
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic',
 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'VL PGothic', 'Noto Sans CJK JP']
これは某WWWサイトに載っていたものだが (どこのサイトだったか、 メモをなくしてしまった…)、色々なフォントを探すようにしてある。 Mac の場合は最初の 'Hiragino Maru Gothic Pro' で解決する。 Meirio や Yu Gothic は Windowsで有効なもの? IPAexGothic や IPAGothic は IPA (独立行政法人情報処理推進機構) が開発・公開しているフリーのフォントである。 IPA フォントは、自分で入手・設定すれば、 Windows, Mac, Linux のいずれでも利用可能である。

(2022/10/15) このやり方は、個人的に今のところトラブル・フリーである。印象はとても良い。


以下、細々としたメモ。

フォントに関しての調査
私のデフォールトのフォントは?
import matplotlib.pyplot as plt
print( plt.rcParams['font.family'] )
print( plt.rcParams['font.sans-serif'] )

システムにどういうフォントが用意されている?
import matplotlib.font_manager as fm
fm.findSystemFonts()

日本語が利用可能なフォントを調べる
import matplotlib
import matplotlib.pyplot as plt
 
fonts = set([f.name for f in matplotlib.font_manager.fontManager.ttflist])
print(fonts)

plt.figure(figsize=(10,len(fonts)/4))
for i, font in enumerate(fonts):
    plt.text(0, i, f"日本語:{font}", fontname=font)

plt.ylim(0, len(fonts))
plt.axis("off")
    
plt.show()

IPAフォント     IPAフォントを利用する方法を説明する。現象数理学科 Mac の場合は、 MacTeX をインストールしてあるので、 バージョンによっては、IPAフォントがすでに存在するかもしれない。
これで探し出せる? (ターミナルで実行する)
mdfind ipaexg.ttf
なければネットから入手する。

私は MacTeX 2021 を使っているので、 /usr/local/texlive/texmf-local/fonts/truetype/cjk-gs-integrate/ipaex g.ttf に見つかった (デフォールトで入っているのかどうかは知らない)。
リンクを張る (ターミナルで実行する)
sudo ln -s /usr/local/texlive/texmf-local/fonts/truetype/cjk-gs-integrate/ipaexg.ttf  \
  /opt/local/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/
(張るところをどこにするかはケースバイケースなんでしょう。 私は MacPorts の Python を使っているせいで、 /opt/local の下だけれど…)



桂田 祐史