akiyoko blog

akiyoko の IT技術系ブログです

matplotlib のグラフに日本語を表示する方法(文字化け対応)

今回の内容は、Jupyter Notebook 上で matplotlib を利用したグラフを描画する際に日本語のラベル名が文字化けしてしまう事象への解消方法です。


ローカルの実行環境は以下の通り。

  • MacOS Sierra 10.12.3
  • Python 2.7.12 (Anaconda 4.2.0)
  • Jupyter Notebook 4.2.0
  • pandas 0.18.1


 

困ったこと

(ipynb ファイルの先頭部分はこのような感じで書いています。)

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
% matplotlib inline

plt.style.use('ggplot')


例えば、次のようなデータがあるとして、

df = pd.DataFrame({u'データ1': [0, 2, 4],
                   u'データ2': [1, 2, 3]})
df

f:id:akiyoko:20170409131243p:plain:w150


matplotlib を利用して Jupyter Notebook 上にグラフを描くと、何もしないデフォルトの状態では、タイトルや判例、XY軸のラベル名などの日本語が文字化けして(いわゆる「豆腐」になって)しまいます。

df.plot(y=[u'データ1', u'データ2'])
plt.xlabel(u'X軸')
plt.ylabel(u'Y軸')
plt.title(u'日本語・テスト')

f:id:akiyoko:20170409131300p:plain



ここで、Mac にデフォルトでインストールされているゴシックフォント「AppleGothic」を指定すると、ほとんどの文字化けは解消されますが、まだ一部の文字(「ー」や「・」など)が文字化けしてしまいます。

font = {'family': 'AppleGothic'}
matplotlib.rc('font', **font)

df.plot(y=[u'データ1', u'データ2'])
plt.xlabel(u'X軸')
plt.ylabel(u'Y軸')
plt.title(u'日本語・テスト')

f:id:akiyoko:20170409131622p:plain



 

解決策

いろいろ調べてみると、フリーで使える TrueType フォントである「IPAex ゴシック」フォントを利用するのが一番手っ取り早そうでした。


以下の手順で解決できました。

  • 1)IPAex ゴシックフォントをインストール
  • 2)matplotlib のフォントキャッシュを削除


 

1)IPAex ゴシックフォントをインストール

IPAexフォントのダウンロードページから「IPAexフォント Ver.003.01」をクリック。
http://ipafont.ipa.go.jp/node17#jp

f:id:akiyoko:20170409130932p:plain

IPAexゴシック(Ver.003.01) のリンクから「ipaexg00301.zip(3.92MB)」をダウンロードします。

f:id:akiyoko:20170409131004p:plain


「~/Library/Fonts/」に .ttfファイルをコピーして、フォントをインストールします。

$ cp ~/Downloads/ipaexg00301/ipaexg.ttf ~/Library/Fonts/

なお公式ページは「/Library/Fonts」へのインストールを推奨していますが、私はいつもユーザ単位でインストールしています。


ちなみに、「/System/Library/Fonts/」は Mac のシステムが使用するフォントが格納されているので、ここには追加しないように注意。



2)matplotlib のフォントキャッシュを削除

次に、「~/.matplotlib/」直下のフォントのキャッシュを削除します。

$ rm ~/.matplotlib/fontList*.cache





最後に、確認。

font = {'family': 'IPAexGothic'}
matplotlib.rc('font', **font)

df.plot(y=[u'データ1', u'データ2'])
plt.xlabel(u'X軸')
plt.ylabel(u'Y軸')
plt.title(u'日本語・テスト')

f:id:akiyoko:20170409131800p:plain





以下のサイトを参考にしました。

(参考)


 

もっと便利に使う(matplotlibrc を作成)

「~/.matplotlib/matplotlibrc」を作成し、そこに利用する font.family などの指定をしておくと、matplotlib がその設定ファイルを優先的に読み込んでくれるようになります。


以下のファイルを作成します。

~/.matplotlib/matplotlibrc

font.family         : IPAexGothic



この設定ファイルを書いておくと、

font = {'family': 'IPAexGothic'}
matplotlib.rc('font', **font)

の設定は不要になります。


反映されない場合は、以下のコマンドを実行すれば解消するかもしれません。

$ rm ~/.matplotlib/fontList*.cache


 

参考

matplotlib.rc() で指定する暫定的な方法ではなく、恒久的に文字化け対策をしたい方には、この本をオススメします。


Matplotlib の日本語文字化け対策について 9ページも割いて詳細に解説しています。それだけでなく、Jypyter Notebook の基礎的な部分から応用編まで幅広く収録してあり、ボリュームも400ページ超えで大満足の一冊です。