tkherox blog

データサイエンスおよびソフトウェア開発、たまに育児についての話を書いています

matplotlibの文字化け解決の最適解『japanize-matplotlib』

matplotlibの文字化け

データ分析を行なっている方であれば当然EDA(探索的データ分析)のフェーズで自身が扱っているデータを理解することに努めると思います.このプロセスを丁寧に行うことで「扱っているデータがどのような情報を持ってるのか」,「データ分布がどのような形状になっているか」,「欠損値がどれくらい含まれているのか」などを把握することができます.

そして,分析者は理解したデータ内容を第3者にレポーティングするという責任を負っており,分かりやすく伝えるために データ可視化 を自在に使いこなすことがが非常に重要となってきます.

その可視化の際に頻繁に出くわす問題が Matplotlib を用いた可視化における文字化けです.データにマルチバイト文字を含まずとも,聴衆に合わせて仕方なく日本語でラベルを付与してグラフを可視化することによって文字化けが生じるなんてことも往々にしてあります.個人的には英語表記で可視化すれば済む話だと思うのですが,伝わりやすさという観点では日本語を利用した方が良い場合もあります. そこで,今回はこの Matplotlib を用いた可視化におけるマルチバイト文字に対する対処法について記載します.

ちなみに余談にはなりますが,データ可視化では以下のサイトが便利でよく参考にさせてもらっています.可視化パターンとPythonでの実装方法がセットになっているため効率的な可視化ライフを送ることができます.是非活用してみてください.

python-graph-gallery.com

また,以下の記事ではケース別でどの可視化を選択するべきかをわかりやすくまとめてくれています.こちらも非常に役立つので適宜活用していくことをお勧めします.

qiita.com

対処法

少し話がそれましたが,ここからは本題の Matpliotlib におけるマルチバイト文字の文字化けへの対処法についてです.

具体的には以下の対処法があります.

  1. スクリプト実行時にフォントを指定する
  2. matplotlibrcの設定ファイルでフォントを変更する
  3. japanize-matplotlibを利用する

個人的にマルチバイト文字をコストをかけずに文字化けすることなく可視化する方法としては 3番目のjapanize-matplotlibが有効 だと思います.そのため,以降ではjapanize-matplotlibの使い方について説明していきます.
1番目と2番目の対応を知りたいという方は以下のサイトが詳しく記載していますのでそちらを参照してみてください.

qiita.com

japanize-matplotlib

japanize-matplotlibとは Matplotlib を日本語表示に対応させるためのPythonライブラリです.

github.com

importと同時に IPAexGothic のフォントを自動で追加して,追加したフォントを利用する設定処理を適応することで日本語が文字化けしないようにしています.
また,Matplotlibのバージョンが 3.2 以上の場合は createFontList メソッドが非推奨になったため,createFontListを利用すると警告が表示されるようになりました.そのため,japanize-matplotlibでも内部で createFontList を利用していることから警告が表示されるようになっていましたが,こちらは2020年5月にソースコードが以下のように修正されて警告が出力されないように対応されています.

is_support_createFontList = LooseVersion(matplotlib.__version__) < '3.2'
if is_support_createFontList:
    font_list = font_manager.createFontList(font_files)
    font_manager.fontManager.ttflist.extend(font_list)
else:
    for fpath in font_files:
        font_manager.fontManager.addfont(fpath)
matplotlib.rc('font', family=FONT_NAME)

次からはインストールと利用方法について記載していきます.
実行環境は以下となっています.

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G6042

$ python -V
Python 3.6.9

インストールはpipにて実施できます.

$ pip install japanize-matplotlib

続いてjapanize-matplotlibの利用方法です.
まず,通常の Matplotlib でマルチバイト文字を出力した場合のグラフを確認してみましょう.scikit-learnに含まれるワイン成分に関するデータについて,アルコール度数とりんご酸の関係を散布図で出力してみます.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine

data = load_wine()
df = pd.DataFrame(data.data, columns=data.feature_names)

# Visualization
fig, ax = plt.subplots(figsize=(12, 8))
plt.scatter(df.alcohol, df.malic_acid, cmap="Blues", alpha=0.8, edgecolors="grey", linewidth=2)
 plt.xlabel("アルコール")
plt.ylabel("リンゴ酸")
plt.title("2属性間の散布図")
plt.show()

上記ソースコードを実行すると以下のようなグラフが可視化されるはずです.しっかり文字化けしていますね.

f:id:takaherox:20210130174236p:plain

次にjapanize-matplotlibを利用して同じ要領で可視化を行ってみます. 利用方法は Matplotlib をインポートした後に japanize_matplotlib をインポートするだけです.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import load_wine

data = load_wine()
df = pd.DataFrame(data.data, columns=data.feature_names)

# visualization
fig, ax = plt.subplots(figsize=(12, 8))
plt.scatter(df.alcohol, df.malic_acid, cmap="Blues", alpha=0.8, edgecolors="grey", linewidth=2)
plt.xlabel("アルコール")
plt.ylabel("リンゴ酸")
plt.title("2属性間の散布図")
plt.show()

文字化けしていたマルチバイト文字がちゃんと表示されていますね.
このように簡単に文字化けを修正することができるので是非活用してみることをお勧めします.

f:id:takaherox:20210130174243p:plain

まとめ

今回は Matpliotlib におけるマルチバイト文字利用おける対応を「japanize-matplotlib」を中心にまとめてみました.
以前は私もフォントの設定を変更して文字化け対応をしていたのですが,japanize-matplotlibに出会ってからはこちらを利用させてもらっています.毎回スクリプトで処理を記述するのも,設定ファイルを作成する手間も省けるので是非活用してみてください.