import matplotlib
matplotlib.matplotlib_fname()
'C:\\Users\\mk\\.matplotlib\\matplotlibrc'
これが、Python27\lib\site-packages\matplotlib\mpl-data\matplotlibrc のような場所だったら、これまでMatplotlibのカスタマイズしたことが無い人です。 上記のmatplotlibrc はデフォルトの設定ファイルなので、これは触らずに、
C:\Users\あなたの名前\.matplotlib
というフォルダを探して下さい。 fontList.cache というファイルが見つかったでしょうか?
ここに先ほどの matplotlibrc というファイルをコピーしましょう。
先ほどコピーしたユーザフォルダの下にある設定ファイルをテキストエディタで開き、
#font.family
で始まる行を探し、
font.family : IPAexGothic #フリーフォントの名称。fontList.cacheを見れば分かる。
と書き換えて下さい。
もし、Ipython Notebookを開いていたら、一旦閉じて、開きなおして下さい。
def nihongo_test():
plt.plot(np.arange(10),'yo')
ax=plt.gca()
ax.set_aspect('equal')
plt.xlabel(u'日本語sfasl'+r' $y=a x^{2} \alpha \beta $')
plt.text(3,3,u'日本語です。',horizontalalignment='left',verticalalignment='center')
plt.text(5,5,u'日本語です。',rotation='vertical',horizontalalignment='center',verticalalignment='bottom')
plt.text(7,7,u'日本語です。',rotation=45,horizontalalignment='center',verticalalignment='center')
plt.grid()
nihongo_test()
日本語は表示されたでしょうか?
こちらの場合には、設定ファイルをいじる必要はありません。 もし、他の設定も不要な方はユーザの設定ファイルを消しても構いませんが、今後、何らかの設定をする可能性を考えて、残しておいて構いません。 ただし、先ほど書き換えた
font.family
の行は
#font.family
と再びコメントアウトし直しておいてください。 Ipython Notebookを開いている人は閉じて開きなおすと有効になると思います。 Kernel Restartでも良いかも知れません。
先ほどの同様にフリーのフォントをインストールし、 以下のセルを実行してください。
import matplotlib as mpl
mpl.rcParams['font.family']='IPAexGothic'
#mpl.rcParams['font.serif'] ='IPAexMincho'
#mpl.rcParams['font.sans-serif'] = 'IPAexGothic'
nihongo_test()#上記のnihongo_testの定義セルが未実行だったら、そちらを先に実行してください。
フォント設定を元に戻すには、以下の一行でOKだと思います。
mpl.rcParams['font.family']='sans-serif'
nihongo_test()
import matplotlib.font_manager
prop = matplotlib.font_manager.FontProperties(fname=r'C:\Windows\Fonts\msgothic.ttc')
上記のようにFontPropertiesのインスタンスを作っておいて、以下のように各テキストで指定します。
plt.plot(np.arange(10),'yo')
ax=plt.gca()
ax.set_aspect('equal')
plt.xlabel(u'日本語sfasl'+r' $y=a x^{2} \alpha \beta $',fontproperties=prop)
plt.text(3,3,u'日本語です。',horizontalalignment='left',verticalalignment='center',fontproperties=prop)
plt.text(5,5,u'日本語です。',rotation='vertical',horizontalalignment='center',verticalalignment='bottom',fontproperties=prop)
plt.text(7,7,u'日本語です。',rotation=45,horizontalalignment='center',verticalalignment='center',fontproperties=prop)
plt.grid()
def text_nihongo():
import matplotlib.font_manager
prop = matplotlib.font_manager.FontProperties(fname=r'C:\Windows\Fonts\msgothic.ttc')
import matplotlib.text as text
fig=plt.gcf()
for o in fig.findobj(text.Text):
o.set_fontproperties(prop)
#plt.setp(o,fontproperties=prop)としても良いようです。
nihongo_test()
text_nihongo()
figure中にあるtextオブジェクトを探し、全てのフォントプロパティをMSゴシックに変更しました。
フォントの設定に関しては個人サイトの情報がかなり役立ちました。 逆に、Matplotlibの正式サイトを見てもなかなか理解が進みませんでした。 フォントの問題はシステムに固有の問題を含んでいる為かも知れません。
Python3系ではユニコード化が進んでおり、日本語の扱いが比較的楽になっているように見えますが (私自身はまだPython2系のユーザなので、本当のところは知りませんが)、 Matplotlibでは(python3系に対応しているとは言え、)システム内部のフォントを直接指定する方法が取られています。 出来たプロットの再配布によるライセンスの問題があるためだろうかと想像しています。
問題の本質は正直、良く理解できていませんが、世界中のコンピュータシステムが日本語を表示できる何らかのフリーのフォントを共通して保持していれば解決する問題だろうと思います(ユニコード対応フォントなら、既に済んでいる問題なのではないのか?)。
さて、上記の様々な方法のうち、私がおすすめするのは、IPAexフォントをインストールして、設定ファイルをいじるか、
いじらずに、
mpl.rcParams['font.family']='IPAexGothic'
と
mpl.rcParams['font.family']='sans-serif'
で切り替える方法です。
グラフをPDFやEPSなどフォントを埋め込む(embedする)ファイル形式に変換して、日本語圏外の人に配布するのでなければ、日本語フォント(全角スペースとか)が混ざっていても問題は起こらないと思います。