今回の内容は、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
matplotlib を利用して Jupyter Notebook 上にグラフを描くと、何もしないデフォルトの状態では、タイトルや判例、XY軸のラベル名などの日本語が文字化けして(いわゆる「豆腐」になって)しまいます。
df.plot(y=[u'データ1', u'データ2']) plt.xlabel(u'X軸') plt.ylabel(u'Y軸') plt.title(u'日本語・テスト')
ここで、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'日本語・テスト')
解決策
いろいろ調べてみると、フリーで使える TrueType フォントである「IPAex ゴシック」フォントを利用するのが一番手っ取り早そうでした。
以下の手順で解決できました。
- 1)IPAex ゴシックフォントをインストール
- 2)matplotlib のフォントキャッシュを削除
1)IPAex ゴシックフォントをインストール
IPAexフォントのダウンロードページから「IPAexフォント Ver.003.01」をクリック。
http://ipafont.ipa.go.jp/node17#jp
IPAexゴシック(Ver.003.01) のリンクから「ipaexg00301.zip(3.92MB)」をダウンロードします。
「~/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'日本語・テスト')
以下のサイトを参考にしました。
(参考)
もっと便利に使う(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ページ超えで大満足の一冊です。