Posted at

【Seaborn】日本語を表示する (フォントを変更する)

More than 3 years have passed since last update.


Seaborn?

Seaborn とは、Pythonの外部モジュールのひとつで、統計データの可視化を目的として作られています。

公式ページでは、


Seaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing attractive statistical graphics.

(SeabornはmatplotlibにもとづくPythonの可視化ライブラリです。魅力的な統計グラフを描くためのハイレベルなインターフェースを提供します。)


と説明されています。要は、matplotlibをかっこ良く、かつ使いやすくするためのライブラリです。

しかし、Seabornはフォントの問題でデフォルトでは日本語をうまく表示することが出来ません1

import seaborn as sns

sns.plt.plot([0,1], [0,1]); sns.plt.title('tofu - 豆腐')

tofu1.png

そこで、日本語を表示できるようにフォントを書き換えたいと思います。


対症療法

一時しのぎとして、「その場で使うフォントを指定する」という方法があります:

sns.set(font='Yu Gothic')

sns.plt.plot([0,1], [0,1]); sns.plt.title('tofu - 豆腐')

tofu2.png

しかしこの方法だと、seabornをimportするたびに毎回設定する必要がありますし、何かのタイミングでフォントをデフォルト値に戻される2と、また設定をし直す必要があります。


原因療法?

そもそもseabornのデフォルト値をいじってしまえば問題が解決できるはずです。

順番に見ていこうと思います。


matplotlibにフォントを追加する

seabornはmatplotlibの上で動くので、好きなフォントを使うためにはmatplotlibにフォントを追加する必要があります。


フォントダウンロード

別になんでもいいんですが、今回はIPAexフォントを使うことにします。ダウンロードして解凍すると、ipaexg.ttfというファイルがあるはずです。


matplotlibの設定ファイルの場所を探してフォントを追加

import matplotlib as mpl

print(mpl.matplotlib_fname())

を実行してみてください。 あなたのmatplotlibが現在参照している設定ファイルのパスが表示されます。 デフォルトでは、python_install_folder\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrcです。

matplotlibrcの存在するフォルダ、つまりmpl-dataの下にあるfontsフォルダのttfフォルダに、先ほどダウンロードしたipaexg.ttfというファイルをコピーしてください。

これでmatplotlibはIPAexフォントを使えるようになります3


seabornの設定ファイルを書き換える

site-packagesにある、seabornフォルダのrcmod.pyをエディタで開いてください。

66-67行目のdef set(context="notebook", ...をコメントアウトして次の行を追加:

def set(context="notebook", style="darkgrid", palette="deep",

font="IPAexGothic", font_scale=1, rc=None):

さらに、199から201行目あたりにある"font.family": ["sans-serif"]をコメントアウトして次の行を追加:

"font.family": ["IPAexGothic"],

以上で準備完了です4。Pythonをもう一度立ち上げて確認してみます。

import seaborn as sns

sns.plt.plot([0,1], [0,1]); sns.plt.title('tofu - 豆腐')

tofu3.png

イイネ!


ちなみに

import matplotlib as mpl

font_paths = mpl.font_manager.findSystemFonts()
font_objects = mpl.font_manager.createFontList(font_paths)
font_names = [f.name for f in font_objects]
print(font_names)

を実行すると、matplotlibが現在使えるフォントの名前の一覧を吐きます (Default fonts in Seaborn statistical data visualization in iPython)。


1. Windowsでは日本語が表示できませんが、Mac、Linuxはどうなっているのか知りません。もし日本語が表示できないなら同じ方法で解決できるはずです。

2. sns.set()するとデフォルトに戻される

3. このフォルダは、matplotlibをアップデートすると上書きされる恐れがあるそうです。

4. このフォルダも、Seabornをアップデートすると上書きされそう。