Python
matplotlib
networkx

sudo権限がない環境でmatplotlib/networkXの豆腐を避ける方法


はじめに

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)


参考:

- how to set up a custom font with custom path to matplotlib global font?

- PythonライブラリのmatplotlibとNetworkXの日本語文字化け解消

- グラフを描画する — 読書ノート v1.4 - プレハブ小屋