matplotlibの日本語文字化けが直らない→seabornの設定も必要だった


実行環境

windows 7 (64bit)
Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
matplotlib.__version__ # -> '2.0.0'
seaborn.__version__ # ->'0.7.1'

一部のファイルでのみ、日本語フォントの設定が反映されない

Jupyter Notebookの上でグラフを描画したが、日本語が文字化けしていた。
「matplotlib 日本語 文字化け」で検索すると、いくつかのサイトがほとんど同じ手順を紹介している。そのとおりに設定した。しかし、色々やってみてもなぜか設定が反映されず、グラフの日本語は四角い記号(いわゆる豆腐)に文字化けしたままだった。

ところが、検証用に新たにJupyter Notebookを作って実行してみたところ

import matplotlib.pyplot as plt
%matplotlib inline 
plt.figure()
plt.xlabel('豆腐 - tofu')
plt.title('豆腐 - TOFU')

結果:
f:id:soratokimitonoaidani:20180812232037p:plain

正しく日本語が表示されている。不思議に思って設定を表示してみると以下の結果になった。

import matplotlib
matplotlib.matplotlib_fname() #設定ファイルの場所を表示する'D:\\Code\\Anaconda3\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc'


print(matplotlib.rcParams['font.family']) #使用フォントを表示する
→ ['IPAexGothic']

設定変更のために色々試していたので、Anacondaをインストールしたフォルダの中のmatplotlibrcを直接書き換えている。(本当は、自分のぶんのmatplotlibrcを別途作って、それを読み込ませるのが良い)
ともかく、IPAフォントを正しく読み込んで設定できているのが分かる。

ところが、元々の(日本語が文字化けしたままの)Jupyter Notebookで同じように設定を表示したところ……

import matplotlib
matplotlib.matplotlib_fname()
→ 'D:\\Code\\Anaconda3\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc'


print(matplotlib.rcParams['font.family'])
['sans-serif']

あれれ。
全く同じ設定ファイルを読み込んでいるにもかかわらず、使用フォントが違っている。
フォント設定が ['sans-serif'] になっていて、IPAフォントを読み込めていないから、文字化けが起きているんだ。
何でこんなことが起きているんだ?

キャッシュ削除、ファイル名変更→効果なし

前からこの作業ファイルを使っていたから、キャッシュが設定ファイルを無視して古い設定を読み込んでいるんだろうか……?
それならば、フォント関連のキャッシュファイルを削除することで解決しそうだ。

C:\Users\[ユーザ名]\.matplotlib の下のfontList.py3k.cache というファイルを削除し、全てのNotebookを一旦閉じて、Powershell上でjupyterを停止・再起動してみた。
しかし、状況は全く変わらない。

次に、全てのNotebookを一旦閉じて、Powershell上でjupyterを停止して、問題のファイル(.ipynb)を名前変更。
しかし、状況は全く変わらない。

キャッシュ周りの問題ではなさそうだ。

こうなったらファイルの中身が問題だろうな……と、元々のファイルを少しずつコピーしながらフォント設定を確認し、原因を切り分けていった。
その結果がこちら。

import matplotlib
print(matplotlib.rcParams['font.family'])
→ ['IPAexGothic']

import seaborn as sns

import matplotlib
print(matplotlib.rcParams['font.family'])
→ ['sans-serif']

seabornを読み込んだところでmatplotlibの設定フォントが勝手に変わっている! 何これ!

一部のファイルだけ直らない理由もわかった。
新たに作ったファイルでは、seabornをimportせずにmatplotlibだけimportしてからグラフを描いたから、日本語が正常に表示されたんだ。


seabornのフォント設定

seaborn font familyで検索したら出てきた。

(pythonのインストールフォルダ)\Lib\site-packages\seaborn\rcmod.py を開いて以下の通り修正する。

def set(context="notebook", style="darkgrid", palette="deep",
        font="sans-serif", font_scale=1, color_codes=False, rc=None):

def set(context="notebook", style="darkgrid", palette="deep",
        font="IPAexGothic", font_scale=1, color_codes=False, rc=None):

に変更する。
この修正を実行すると、matplotlibおよびseabornで描いたグラフの日本語が正しく表示された。


結論

matplotlibだけではなく、seabornを使う場合には別途設定が必要です(seaborn用の設定ファイルを変更する必要がある)。


参考:
matplotlibで描画したグラフの文字化けを解消する - Qiita
【matplotlib】日本語の設定 - keisukeのブログ
【Seaborn】日本語を表示する (フォントを変更する) - Qiita