MENU

matplotlib / seaborn の日本語の文字化けを直す、汎用的かつ一番簡単な設定方法

たぬ

こんにちは、グロースハッカーの たぬ ( @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 titleFigure 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('チケットクラスごとの生存率')

この記事が気に入ったら
フォローしてね!

シェアしていただけると励みになります
  • URLをコピーしました!

コメント

コメントする

目次
閉じる