ill-identified diary

「大手企業」で働くデータサイエンティストのブログです。所属組織の見解などとは一切関係なく小難しい話ばかりしてるので人気がありません。

Python のグラフィクスパッケージの日本語設定を自動でやるパッケージを作った


概要

いくつかの Python グラフィックパッケージは, 未だに非欧文フォントの表示を考慮していない. 5年くらい放置していたが, 未だに改善されないので最低限の機能だけ作った.

github.com

このパッケージを併用すれば, 従来日本語表示できなかった, あるいは表示させるのが大変面倒だったものが簡単に表示できるようになる.

作例

2026/9/5更新

自動設定させるために毎回 import するのは別に便利でもなんでもないので, v0.9.0からは余計な import をしなくても日本語フォントを使えるようにした. 以降の説明文も書き換えた.


詳細

Matplotlib は (なぜか) 今も Python で広く使われているグラフィックスパッケージだが, そのままの設定ではグラフのラベル等に日本語を書こうとしても文字化けする.

このパッケージによって Matplotlib および Matplotlib をバックエンドとしている seaborn や plotnine の日本語表示もできるように簡単に設定してくれる.

インストール方法や詳細な使い方はパッケージの配布ページに書いてあるのでここではあまり同じことを繰り返さない.

github.com

pyplot-localizer のコンセプトは, グラフィックスパッケージでの日本語表示をなるべく簡単に可能にすることである. そのため今のところは使用するフォントを詳細に設定する機能はないが, いくつかの候補から選べる.

最も簡単な使用例は以下のように, matplotlib を使う際に import matplotlib.pyplot as plt ではなく, import plot_localizer.matplotlib.pyplot as plt と書くことである.

import plot_localizer.matplotlib.pyplot as plt

plt.plot()
plt.title("亜阿アあ")

他のパッケージも同様である. 他に対応しているパッケージは v0.9.2 時点では以下である.

import plot_localizer.pandas as pd
import plot_localizer.seaborn as sns
import plot_localizer.plotnine as p9


技術的な問題の補足


rcParams の使い方

Matplotlib が使用するフォントは rcParams の設定にに依存しているので, これを書き換えてしまえば解決する. このパッケージを使う必要もない. しかし, なぜか巷 (ネット) に出回ってる情報は不正確なのでここで詳しい話をする.

よく見かけるのは, "font.family" 属性にフォント名を代入する, というものである.

from matplotlib import rcParams

rcParams["font.family"] = "任意のフォント名"

確かにこの方法でも動作はするが, 本来意図された使い方ではない. フォールバックしないからだ. 実際に rcParams の中身を見れば分かることだが, "font.sans-serif", "font.serif", "font.monospace" といった属性があり, それぞれにはフォントファミリー名がリストで与えられている. そして "font.family" のデフォルト値は "sans-serif" である. つまり, rcParams["font.family"] は本来はスタイルを指定するもので, 対応するスタイル名の属性からフォントを取得する. 例えば以下を実行すると, 使用するフォントが, デフォルトのサンセリフからセリフに変更され, そして日本語が游明朝 (YuMincho) で表示される. もちろん, 游明朝がインストールされている必要がある.

rcParams["font.family"] = "serif"
rcParams["font.serif"].append("Yu Mincho")

インストールされているフォント一覧を表示する機能も用意しているので, 具体的にどういう名前で指定すればよいかわからない場合はそちらを使うとよいだろう.


余計なパッケージを使わずに設定する方法

この rcParams は, Pythonセッションのたびに読み込むため, 毎回パッケージをインポートする必要がある. しかし, そのデフォルト値は .matplotlibrc というテキストファイルから読み取られるので, .matplotlibrc の値を書き換えれば毎回設定する必要もなくなる. このファイルの場所は matplotlib.matplotlib_fname() で特定できるが, 一方で matplotlib には現在の設定をテキストファイルに書き出す機能がないという, 今どき信じられない不備が存在する.


plotnine は rcParams を無視してしまう

しかし, plotnine パッケージは matplotlib をバックエンドにしているが, rcParams を書き換えても効果がない. plotnine 側の実装のせいで, フォント関連の設定が上書きされてしまうからだ. 以前この問題に対して pull request を送ったが, 問題を理解してもらえず却下されてしまった. というわけで plotnine は未だにこの点で不便なまままである. そのため, 現在はフォント設定を上書きしないように改造した継承クラスを提供するという方法で対処している.


今後の課題

  • フォント検出機能をより高度にする
  • ラスタ画像以外の出力でもフォントを使えるようにする
  • たぶん中韓のフォントに関しても同じ問題があるので, 多言語対応できないか試す

さいごに

Python のグラフィックスパッケージはフォント以外の点でも不便なものが多いので, 根本的に設計し直したパッケージが現れないものかと思う (他人任せ)