Matplotlibはグラフ作成に便利だけど・・・
近年ますます需要が高まっているプログラミング言語であるpython、そんなpythonでのグラフ作成といえば、Matplotlibというライブラリを使うのが一般的です。
とまあこんな感じでMaplotlibはpythonでのデータ分析・グラフ作成・プロットに欠かせないライブラリな訳ですが、1つ大きな問題が存在します。
それは何かというと、日本語が文字化けするというものです。例えばpythonでplt.plot()で作ったグラフにラベルや凡例・グラフのタイトルなどに日本語を使用すると、□□□□□みたいな文字化けが起こってしまいます。
この原因はmatplotlibの既定のフォントがDejaVu Serifになっているからで、このフォントは日本語に対応していないので、日本語は豆腐で表示されてしまいます。
じゃあコンソール上で日本語対応のフォントに関数なりで再設定すればいいじゃないかという話になるわけですが、PCにデフォルトでインストールされている日本語のフォントの殆どがttcフォントファイルで、matplotlibはttcフォントファイルに対応していないんですよね。
例えば、Windowsで年賀状とかワードとか触ったら一度くらい目に触れているMSゴシック、MS明朝、メイリオ、游ゴシックはttcファイルです。なので、このままだとMatplotlibで使える日本語フォントはPCにインストールされていないので、Matplotlibで作ったグラフに日本語のラベル・凡例を表示させることはできません。
この問題の解決に自分も結構苦労しまして、データ分析が本題なのに、グラフに日本語を表示させるというしょーもない点で2度と時間を割きたくないので、対応方法を自分のメモ書きを兼ねて書きます。
なお、今回紹介するのはWindows、jupyter notebook環境下での設定方法です。ご留意ください。
実行環境
Windows10(64bit)
jupyter notebook
Matplotlibで使える日本語フォントをダウンロード・インストール
上述したようにMatplotlibで日本語が表示できないのはMatplotlibが読み込めるフォントの中に日本語のフォントがないからです。
というわけで、Matplotlibが読み込める日本語のフォントをダウンロードする必要があります。このNoto~はGoogleのフォントで世界各国の言語に対応しているフォントなので、まあ怪しいものではないです。
そしてダウンロードしたNoto Sans CJK JP、Noto Serif CJK JPを、解凍し中身を「コントロールパネル→デスクトップのカスタマイズ→フォント」の右側のエリアにドラッグ&ドロップしインストールします。
これでインストールが完了すれば、PC内部にttcファイルの日本語フォントがインストールされたことになるので、あとはMatplotlibの設定を少し変更します。
Matplotlibの設定ファイルを変更する
Matplotlibに先ほどインストールした日本語フォントを反映させる方法は以下の3つです。
①個別にフォントの設定をする
②スクリプトの最初でフォント変更の宣言をする
③設定ファイルmatplotlibrcを修正して既定のフォントを変更する
1番簡単なのは、①個別にフォントの設定をするなのでとりあえずそれでやると、コンソールを起動して以下の記述で、フォントを変更すれば完了です。
#Matplotlibのフォントを変更する
import matplotlib.pyplot as plt
from pylab import rcParams
import matplotlib as mpl
font = {"family":"Noto Sans CJK JP"}
mpl.rc('font', **font)
ただしここでnot found family~みたいなエラーがでてしまう人は、フォントの検索にキャッシュ使ってるおり、キャッシュを削除しないとインストールしたフォントをMatplotlibが認識していないので、キャッシュを削除する必要があります。
このキャッシュを削除しないと、設定ファイルを弄って場合でもMatplotlibには反映されません。キャッシュが入ってるディレクトリは大体~/.matplotlib
ですが、↓の操作でも確認できます。
#Matplotlibのキャッシュのディレクトリを確認する import matplotlib print(matplotlib.get_cachedir())
僕の場合は「C:\Users\ユーザー名\.matplotlib」にありました。ここにどんなファイルがあるかは環境次第なのですが、基本的にfontList.json(もしくはfontList.py3k.cache)を削除すれば設定完了です。
ちなみにMatplotlibで使用できるフォントは以下の関数で調べることができるので、これの実行結果にNoto sans~があったらインストールと設定は成功しており、先ほどの「font = {“family”:”Noto Sans CJK JP”} mpl.rc(‘font’, **font)」もエラーなく実行できるはずです。
#Matplotlibに使用できるフォントを確認する import matplotlib.font_manager as fm fonts = fm.findSystemFonts() print([[str(font), fm.FontProperties(fname=font).get_name()] for font in fonts[:10]])
これでMatplotlibでも日本語のラベルやタイトルや凡例が文字化けしなくなります。日本語の凡例を付ける機会は多いので、Matplotlibの日本語対応は是非やっておきたいですね。
ちなみにこの方法だと起動したときにいちいちフォントを宣言しないといけないのでそれがめんどくさいという人は「PythonユーザのためのJupyter[実践]入門」にデフォルトのフォントを変更する方法が書いてあったので、そちらを参照していただけると幸いです。
コメント