LoginSignup
6
2

More than 5 years have passed since last update.

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

Posted at

はじめに

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 - プレハブ小屋

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2