matplotlibを使ってグラフ化した時に日本語が文字化けした時にしたことをまとめた備忘録です。
macOS High Sierra 10.13
Python 3.6.5
最初はこんな形で日本語の部分が文字化けしてました。
1.フォントのダウンロード&インストール
IPAexフォントのダウンロードを下記サイトから行います
https://ipafont.ipa.go.jp/node17#jp
ダウンロードしたフォントをライブラリのフォントに追加します。ユーザ毎でもシステム全体でもどちらでも良さそうですが、今回はとりあえず表示さえ出来れば良いとどちらにも入れました(爆)
cp ~/Downloads/ipaexg00301/ipaexg.ttf /Users/[ユーザ名]/Library/Fonts
cp ~/Downloads/ipaexg00301/ipaexg.ttf /Library/Fonts/
2.フォントの設定
フォントを入れた後は設定を行う必要があります。
まずはmatplotlibの環境を確認します。
import matplotlib
print(matplotlib.matplotlib_fname()) #設定ファイルを表示(matplotlibrcは後で作ります)
print(matplotlib.rcParams['font.family']) #現在使用しているフォントを表示
print(matplotlib.get_configdir()) #設定ディレクトリを表示
print(matplotlib.get_cachedir()) #キャッシュディレクトリを表示
#表示結果
['sans-serif']
/Users/[ユーザ名]/.matplotlib
/Users/[ユーザ名]/.matplotlib
上記のsans-serif
が最終的にIPAexGothic
変わればOKという事になります。
これでソースに以下の一文を追加することで日本語が表示できるようになります。
plt.rcParams['font.family'] = 'IPAexGothic'
毎回記述するのが面倒な場合は、先ほど調べた設定ディレクトリ下にmatplotlibrc
を作っておくことで初期設定として記述することもできるようです。
font.family : IPAexGothic # default Font
ということでこれで日本語が表示されるはずでしたが・・・
下記のエラーが出て・・・少しハマってしまいました
UserWarning: findfont: Font family ['IPAGothic'] not found
#3.ここから行ったこと色々
キャッシュが残っているのが原因の可能性もあるとのことでキャッシュを消してみました。(改善されませんでした。というよりそもそもこの中にfontList*.cacheはありませんでした。)
```ターミナル
#キャッシュを消す
rm -rf ~/.matplotlib/fontList*.cache
同じフォルダに出来ているfontList.json
が原因という可能性もあるとのことでしたので削除してみました。(改善されませんでした)
rm -rf ~/.matplotlib/fontList.json
フォントもライブラリに間違いなく入れてるし途方暮れましたので、matplotlib
自体を再インストールしました。
#ライブラリのアンインストール
pip uninstall matplotlib
#「/Users/[ユーザ名]/.pyenv/versions/3.6.5/lib/python3.6/site-packages/matplotlib/」のディレクトリが削除されたことを確認する
#ライブラリのインストール
pip install matplotlib
表示されるようになりました!!
やはり困った時は初めからやり直すというのが基本ですね。何が原因かよくわかりませんが、どこかにキャッシュファイルなどがあったのでしょうか。。(そういえば/Users/[ユーザ名]/.matplotlib
ディレクトリは残したままでした)
日本語確認用に作ったサンプルソース載せておきます。
import matplotlib.pyplot as plt
test_df = pd.DataFrame(columns=['Xデータ', 'Yデータ','Zデータ'])
test_df['Xデータ'] = [1,2,3,4]
test_df['Yデータ'] = [1,2,3,4]
test_df['Zデータ'] = ['あいうえお','愛上大','かきくけこ','牡蠣区家子']
z_data = test_df.plot.scatter(x="Xデータ",y="Yデータ",figsize=(8, 6),s=30)
# 各要素にラベルを表示
for k, v in test_df.iterrows():
z_data.annotate(v[2], xy=(v[0],v[1]), size=15)
■下記のサイトを参考にさせて頂きました。ありがとうございました。
http://akiyoko.hatenablog.jp/entry/2017/04/11/080446
https://qiita.com/hatunina/items/a77128c7f50b19ad2c51