はじめに
matplotlibで日本語ラベルを描画しようと出てくる「豆腐」。
解決するには、matplotlibrcという設定ファイルを弄ればいいのだが、その際にsudo権限を使ってシステムフォントが置いてあるディレクトリに日本語フォントを追加する必要がある。
ここでは、sudo権限が使えない場合の対応法をまとめる。
matplotlibの仕様で、使いたい日本語フォントがttfかttcにより、対応が異なるので、その違いもまとめる。
matplotlib
その1: 日本語ttf: ttfがあるディレクトリを参照するように設定する
フォントディレクトリの追加
import matplotlib.font_manager as font_manager
font_dirs = ['{my_font_dir}']
font_files = font_manager.findSystemFonts(fontpaths=font_dirs)
font_list = font_manager.createFontList(font_files)
font_manager.fontManager.ttflist.extend(font_list)
mpl.rcParams['font.family'] = '{My Font}'
ほとんど参考リンク1と一緒。
ただし、ここで参照するフォントファイルは、ttfでないと正常に反映されない模様。
私の場合、ttcを読み込ませようとしたら、findSystemFontsで読み込んでくれなかった。
fintSystemFonts自体は、フォントファイルのパスのリストを取得するだけなので、手動でcreateFontListに渡すことも可能だが、その場合は結局Sans系のフォントで上書き(?)されてしまい、豆腐の呪縛から逃れることはできなかった。
日本語ttc: 描画時に日本語fontPropertiesを参照する
フォントプロパティの参照
from matplotlib.font_manager import FontProperties
fp = fontProperties(name={my font path})
plt.plot(x, y)
plt.xlabel("x軸のラベル", fontproperties=fp)
plt.ylabel("y軸のラベル", fontproperties=fp)
plt.legend(legends, prop=fp)
plt.show()
networkXの豆腐回避
日本語ttfファイルがある場合
matplotlibの場合と同様の設定をすればよい。
日本語ttcファイルがある場合
一度、networkXの関数で描画した後、各インスタンスを参照してfontPropertiesを設定してあげる。
フォントプロパティの参照
from matplotlib.font_manager import FontProperties
fp = fontProperties(name={my font path})
for t in nx.draw_networkx_labels(G, pos).values():
t.set_fontproperties(fp)
参考: