Matplotlib で日本語のグラフを作成する
Python の matplotlib でグラフを描くと、日本語が文字化けをする。これは、日本語のフォントが設定されていないためである。この記事では FontProperties によって日本語フォントを設定する方法と、macOS で TTC 形式のフォントファイルを扱う方法をまとめる。
FontProperties による日本語フォントの設定
【matplotlib】日本語の文字化けをFontPropertiesで解決で解説されているように、FontProperties を使って日本語のフォントを設定することで、matplotlib のグラフで凡例やタイトルの文字化けを防ぐことができる。また、フォントの使い分けをすることができるようになる。まずは
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
fp = FontProperties(fname=font_path)
によってmatplotlib.font_manager から FontProperties を import して、font_path の場所にあるフォントファイルの内容のフォントを fp という変数に FotProperties インスタンスとして格納する。その後は、たとえば
plt.xticks(fontproperties=fp)
plt.title('グラフのタイトル', fontproperties=fp)
plt.xlabel('X軸のラベル', fontproperties=fp)
plt.ylabel('Y軸のラベル', fontproperties=fp)
plt.legend(loc='center right', prop=fp)
のように fontproperties として fp を渡すことで、グラフのタイトル、ラベルにそのフォントが使われる。凡例の場合には legend に prop として渡す。
matplotlib.font_manager.FontProperties に記されているように、FontProperties では family, style, size などを指定できる。たとえば、斜体でフォントサイズを9とするには
fp = FontProperties(fname=font_path, style='italic', size=9)
とする。
また、plt.rcParams[‘font.family’] を使ってまとめてフォントの設定ができることをすがやみつる先生に教えていただいた。以下のコードによって、ラベルやタイトルなどに個別にフォントを設定することなく、グラフのフォントがすべて指定した日本語フォントで表示できるようになる。
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties, fontManager
fontManager.addfont(font_path)
fp = FontProperties(fname=font_path)
plt.rcParams['font.family'] = fp.get_name()
TTC ファイルの変換方法
macOS では複数のフォントファイルがまとめられた TTC (TrueType Collection) 形式のファイルによってフォントが保存されていることがあり、直接 matplotlib で TTC ファイルを読み込むことができなかった。MacでTTC形式のフォントをTTF形式に分解するに書かれているようにフォントファイルを分解することで読み込むことができた。まずは
brew install fontforge
で fontforge をインストールし、ttc2ttf.pe をダウンロードしてから、たとえば
fontforge -script ttc2ttf.pe '/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc'
とする。ヒラギノ角ゴシック W4.ttc を分解したところ、HiraKakuProN-W4-AlphaNum-01.otf と HiraKakuProN-W4-AlphaNum-02.otf という2つの otf ファイルが得られ、HiraKakuProN-W4-AlphaNum-02.otf をフォントファイルとして FontProperties を設定することで、無事 matplotlib で日本語の凡例が入ったグラフを作成することができた。