0. はじめに
どうでもいいことですが、これが初投稿です。
言語処理100本ノックをPython3でやっていて、グラフ表示をmatplotlibでやろうとしたところ、日本語表示で悶えたので、忘れないようにメモ。
1. 結論
先人の知恵 + キャッシュファイルの削除
です。
※Seabornも使ってます。matplotlibだけだと動くかどうかわかりません。
1-1. 先人の知恵
はここから
【Seaborn】日本語を表示する (フォントを変更する)
or
以下私が試した方法(新しいのでおすすめ?)。こちらだと確実に動くと思います。
1-1'. フォント導入からSeabornのフォント設定変更
先人の知恵セッティングを済ませた方はすっ飛ばして1-2. キャッシュの削除へどうぞ。
(1)フォント導入
適当なフォントを持ってきてインストールします。
※ただし使えるフォントはTrueFont形式(*.ttf)だけです。
先人にならってIPAexフォントを使うことにします。
ダウンロードして解凍すると、ipaexg.ttfというファイルがあるはずなので、そのままインストール(Finderならipaexg.ttfをダブルクリック)しましょう。
(2)Seabornの設定
rcmod.py
を探します。先人は
python_install_folder/lib/site-package/seaborn
の中にあると言ってます。
が、私の環境では(pyenvで管理しているので)
~/.pyenv/versions/3.5.2/lib/python3.5/site-packages/seaborn
にありました。
2016/12/25追記:
anacondaで環境を再導入したところ、更に深い階層にありました。
~/.pyenv/versions/anaconda3-[versionNum]/lib/python3.5/site-packages/seaborn
rcmod.py
を見つけたら、(バックアップしてから)エディタで2箇所変更します。
81, 82行目あたり
def set(context="notebook", style="darkgrid", palette="deep",
font="sans-serif", font_scale=1, color_codes=False, rc=None):
190行目あたり
"font.family": ["sans-serif"],
の
"san-serif"
を"IPAexGothic" (新しいフォント名)
に変更します。
保存してseabornのフォント設定は完了です。
まだ日本語表示はできません。
(小ネタ)元からインストールされてる日本語対応TrueTypeフォントを使う場合は?
Font Bookからインストール済みのフォントを見ることができます。
詳細表示の中のファミリー
の項目を見ましょう。この場合だとMigu 1P
ですね。
このファミリー
に書かれている項目名を新しいフォント名に指定します。
例
"san-serif"
を"Migu 1P" (新しいフォント名)
に変更
1-2. キャッシュファイルの削除
お待たせしました。本題です。
単刀直入に言うと、
fontList.py3k.cache
もしくは
fontList.jsonを消す!!!!
以上です。
おそらく ~/.matplotlib/
にあると思います。matplotlibrcがあるディレクトリですね。複数ある場合はホームディレクトリ直下にあるものが優先されるはずです。
手っ取り早く削除しちゃいましょう。
cd ~/.matplotlib
の後、
rm -f fontList.py3k.cache
rm -f fontList.json
※py3kの部分は環境によって変わるかもしれません。
これでmatplotlibを動かしてみましょう。
キャッシュファイルを作り直すのでいつもより時間がかかるかとは思いますが…
どうですか?うまくいきました?
2018/02/05追記
最近のmatplotlib(version 2.1.0)だと、
fontList.py3k.cache
が見つからず、 fontList.json
の削除で反映されました。
なぜcacheを削除しないとダメなのか
(以降は私の勝手な推論なので間違い等含んでいる可能性があります)
matplotlibは初回起動時にどんなフォントファイルがあるのかをキャッシュファイルにして以降そればっかり読み出すみたいです。
Source
matplotlibの公式GitHubのissue
Won't use a font although it can be found by the FontManager #3590
you'll need to remove the fontList.cache file everytime you want matplotlib to discover new fonts.
という返信がありますので、
フォントの設定を変えたら毎回キャッシュファイルを変えないといけないようですね。