このところ Python で小さなプログラムを書いている。 matplotlib で日本語表示したくなったが、意外と苦戦したので、メモを残しておく (また後で別のマシンで同じことをするだろう)。
参考にしたサイト
方法1: 設定をファイルに書く Mac で、とりあえず表示させるためには、 matplotlibrc に例えば次の設定を (CotEditor とか VS code とかのテキスト・エディターを使って) 書けば良い。
matplotlibrc にこの設定を書き込む |
font.family: Hiragino Maru Gothic Pro |
matplotlibrc をどこに置くか問題となるが、 一般には Python の中で次のようなコマンドを実行して表示できる。
import matplotlib matplotlib.get_configdir() |
~/.matplotlib/matplotlibrc が存在しない場合は自分で新たに作ることになる。 お行儀よくやるには、
import matplotlib 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 を書き込む。) |
フォントの設定のみ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() |
私の場合 |
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'] |
(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/ |