42
37

More than 5 years have passed since last update.

matplotlibの文字化け問題でハマった時のメモ

Last updated at Posted at 2018-05-21

matplotlibを使ってグラフ化した時に日本語が文字化けした時にしたことをまとめた備忘録です。

macOS High Sierra 10.13
Python 3.6.5

最初はこんな形で日本語の部分が文字化けしてました。

Kobito.ElsVTg.png

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の環境を確認します。

hoge.py
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
print(matplotlib.rcParams['font.family'])```でも```['IPAGothic']```と表示されているので設定などは問題なさそうですが・・・



#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ディレクトリは残したままでした)

日本語確認用に作ったサンプルソース載せておきます。

test.py
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)

Kobito.OORm3S.png

■下記のサイトを参考にさせて頂きました。ありがとうございました。
http://akiyoko.hatenablog.jp/entry/2017/04/11/080446
https://qiita.com/hatunina/items/a77128c7f50b19ad2c51

42
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
37