たぬこんにちは、グロースハッカーの たぬ ( @tanuhack )です。
matplotlib や seaborn モジュールで日本語が含まれるグラフを作成すると…
import matplotlib.pyplot as plt
import seaborn as sns
# タイタニック号のサンプルデータを読み込む
df = sns.load_dataset('titanic')
# チケットクラスごとの生存率を横棒グラフで可視化する
g = sns.catplot(data=df, x='survived', y='class', kind='bar', ci=None)
# 見た目の設定
fig, ax = (g.fig, g.ax)
ax.set_title('チケットクラスごとの生存率')

このように、日本語部分が豆腐?みたいな文字列に文字化けしてします。
これは、デフォルトで日本語に対応していない欧文フォント( sans-serif )を使用しているからなんですね。
print(plt.rcParams['font.family'])
# => ['sans-serif']そこで今回は、matplotlib や seaborn モジュールを使って、タイトル(Axes title、 Figure title)や軸ラベル(Axis label)などを日本語で書いたときの文字化けを防ぐ、もっとも汎用的で一番簡単であろう設定方法を紹介します。
環境依存もなく、面倒な設定ファイルの書き換えも行わないので、 Cloud Functions のようなサーバレス環境でも動作します。
設定方法
japanize-matplotlib モジュールをインストールして、読み込むだけです。
% pip install japanize-matplotlib import matplotlib.pyplot as plt
+ import japanize_matplotlib
import seaborn as sns
# タイタニック号のサンプルデータを読み込む
df = sns.load_dataset('titanic')
# チケットクラスごとの生存率を横棒グラフで可視化する
g = sns.catplot(data=df, x='survived', y='class', kind='bar', ci=None)
# 見た目の設定
fig, ax = (g.fig, g.ax)
ax.set_title('チケットクラスごとの生存率')

とっても簡単ですね!
仕組みとしては、japanize-matplotlib のデフォルトフォントがIPAフォントの IPAexゴシック を使用しているからです。
print(plt.rcParams['font.family'])
# => ['IPAexGothic']インストールはjapanize-matplotlib、インポートはjapanize_matplotlibなので、ハイフン-とアンダーバー_の違いに気をつけてください。また、 japanise ではなく japanize なので、綴りにも注意が必要です。
sns.set()との併用について
japanize-matplotlib モジュールを読み込んでから matplotlib でグラフを描画するまでにフォントの設定が変わる処理が入っていると、日本語表示がされないことがあります。
例えば、 seaborn を利用している場合であればsns.set()などで描画フォントが seaborn のデフォルトに上書きされ、日本語表示がされなくなります。
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
+ sns.set()
# タイタニック号のサンプルデータを読み込む
df = sns.load_dataset('titanic')
# チケットクラスごとの生存率を横棒グラフで可視化する
g = sns.catplot(data=df, x='survived', y='class', kind='bar', ci=None)
# 見た目の設定
fig, ax = (g.fig, g.ax)
ax.set_title('チケットクラスごとの生存率')

この問題は、sns.set(font='IPAexGothic')のように利用フォントに IPAexGothic を設定するか、フォント上書き後に japanize_matplotlib.japanize()を実行すれば解決します。
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
- sns.set()
+ sns.set(font='IPAexGothic')
# タイタニック号のサンプルデータを読み込む
df = sns.load_dataset('titanic')
# チケットクラスごとの生存率を横棒グラフで可視化する
g = sns.catplot(data=df, x='survived', y='class', kind='bar', ci=None)
# 見た目の設定
fig, ax = (g.fig, g.ax)
ax.set_title('チケットクラスごとの生存率')



コメント