matplotlibでグラフを描いたら、タイトルや軸ラベル、凡例の日本語が「□□□」(いわゆる豆腐)になってしまった、という経験はないでしょうか。matplotlibで日本語を扱うと、多くの人が最初につまずくのがこの文字化けです。本記事では、文字化けが起きる原因と、Windows・Mac・Google Colabそれぞれでの直し方をまとめます。定番だった「japanize-matplotlib」がPython 3.12以降でエラーになる問題と、その代わりになるパッケージも紹介します。グラフの描き方そのものは、当ブログの「matplotlibの基本シリーズ」(折れ線グラフ・棒グラフ・散布図)と、応用編の複数のグラフを並べる方法で解説しています。
この記事の結論
- 原因は、matplotlibの既定フォント(DejaVu Sans)に日本語の文字が入っていないことです
- どの環境でも、いちばん早いのは
pip install matplotlib-fontjaをしてimport matplotlib_fontjaと1行書く方法です(Google Colabでもこれが手軽です) - パッケージを増やしたくないなら、Windowsは
plt.rcParams["font.family"] = "Meiryo"(または”Yu Gothic”)、Macは”Hiragino Sans”を指定します - japanize-matplotlibはPython 3.12以降だと「No module named ‘distutils’」で止まることがあります。後継のmatplotlib-fontjaに置き換えるのが確実です
- seabornを使うときは、
sns.set_theme()でフォントが上書きされるので、sns.set_theme(font="Meiryo")のようにフォントも一緒に指定します
本記事のコードは、2026年10月時点の環境(Windows 11、Python 3.12.1、matplotlib 3.11.2、seaborn 0.13.2)で実行して動作を確かめています。
日本語が文字化け(□)する原因
まずは文字化けを再現してみます。次のコードは、何も設定せずにタイトル・軸ラベル・凡例に日本語を入れたものです。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 3], label="売上")
ax.set_title("月別の売上")
ax.set_xlabel("月")
ax.legend()
plt.show()
実行すると、グラフ自体は描けますが、日本語の部分はすべて□になります。同時に、次のような警告が文字の数だけ出ます。
UserWarning: Glyph 26376 (\N{CJK UNIFIED IDEOGRAPH-6708}) missing from font(s) DejaVu Sans.
この警告がそのまま原因を表しています。「Glyph」は文字の形(字形)のことで、「DejaVu Sansというフォントには、この文字の形が入っていません」という意味です。matplotlibは何も設定しないと、文字を描くフォントとしてDejaVu Sansを使います。DejaVu Sansには漢字・ひらがな・カタカナが入っていないため、代わりに□が描かれてしまうのです。
つまり直し方は、「日本語の字形が入ったフォントを使うように、matplotlibに教える」の一つだけです。そのやり方が、パッケージに任せる方法(方法1)と、自分でフォントを指定する方法(方法2)の2通りあります。
方法1:japanize-matplotlibを使う
昔からよく紹介されているのが、japanize-matplotlibというパッケージです。日本語フォント(IPAexゴシック)が同梱されていて、インストールしてimportするだけで日本語が表示されるようになります。
pip install japanize-matplotlib
import matplotlib.pyplot as plt
import japanize_matplotlib # この1行を足すだけ
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 3], label="売上")
ax.set_title("月別の売上")
ax.set_xlabel("月")
ax.legend()
plt.show()
pip install のときの名前はハイフン(japanize-matplotlib)、importのときはアンダースコア(japanize_matplotlib)なので、書き間違えないよう注意してください。
ただし、このパッケージには最近の環境で動かないことがあるという大きな注意点があります。次の節で詳しく説明します。
japanize-matplotlibが使えない・エラーになるときの対処
Python 3.12以降で出る「No module named ‘distutils’」
Python 3.12以降の環境でimport japanize_matplotlibをすると、次のエラーで止まることがあります。
File "...\japanize_matplotlib\japanize_matplotlib.py", line 5, in <module>
from distutils.version import LooseVersion
ModuleNotFoundError: No module named 'distutils'
原因は、japanize-matplotlibの中でdistutilsという標準ライブラリを使っていることです。distutilsはPython 3.12で標準ライブラリから削除されました(PEP 632)。そのため、distutilsが使えない環境では、importした時点でエラーになります。
一方で、setuptoolsが入っている環境ではsetuptoolsがdistutilsの代わりを用意するため、Python 3.12でもエラーにならずに動きます。私の手元でも、setuptoolsが入った環境では動き、setuptoolsを読み込まない状態にするとこのエラーが出ました。「人によって動いたり動かなかったりする」のはこのためです。
japanize-matplotlibの更新状況(2026年10月時点)
PyPIとGitHubで確認したところ、2026年10月時点の状況は次のとおりです。
| 項目 | japanize-matplotlib | matplotlib-fontja |
|---|---|---|
| 最新版 | 1.1.3 | 1.1.0 |
| 最新版の公開日 | 2020年10月21日 | 2025年4月24日 |
| Python 3.12以降 | distutilsを使っているため、環境によってはエラー(対応を求めるIssue・プルリクエストは2023年から未解決のまま) | 3.12・3.13・3.14での動作確認がREADMEに記載 |
| 同梱フォント | IPAexゴシック | IPAexゴシック |
| importの書き方 | import japanize_matplotlib | import matplotlib_fontja |
japanize-matplotlibは2020年を最後に新しい版が出ておらず、Python 3.12以降への対応は取り込まれていません。
対処1:後継のmatplotlib-fontjaに置き換える(おすすめ)
matplotlib-fontjaは、japanize-matplotlibをフォークして、Python 3.12以降でも動くように直したパッケージです(作者のREADMEにそう書かれています)。使い方はjapanize-matplotlibとほぼ同じで、importする名前が変わるだけです。
pip install matplotlib-fontja
import matplotlib.pyplot as plt
import matplotlib_fontja # japanize_matplotlib の代わり
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 3], label="売上")
ax.set_title("月別の売上")
ax.set_xlabel("月")
ax.legend()
plt.show()
私の環境(Python 3.12.1、matplotlib 3.11.2)では、distutilsもsetuptoolsも読み込まない状態でエラーなく動き、タイトル・軸ラベル・凡例の日本語が正しく表示されました。フォントがパッケージに同梱されているので、PCに日本語フォントが入っているかどうかに関係なく使えるのが利点です。Google Colabのノートブックなら、セルで!pip install matplotlib-fontjaを実行してからimportします。
なお、Python 3.12・3.13・3.14で動作確認されているとREADMEに書かれているmatplotlibの範囲は3.10までです。私が試した3.11.2では問題なく動きましたが、新しい版で何か起きた場合はGitHubのIssueも確認してみてください。
対処2:setuptoolsを入れる(応急処置)
既存のコードのimport japanize_matplotlibをすぐには書き換えられない場合は、pip install setuptoolsでsetuptoolsを入れると、distutilsの代わりが用意されて動くようになります。ただし、これは止まっているパッケージを延命する応急処置です。これから書くコードでは、matplotlib-fontjaか、次に紹介するrcParamsでの指定を使うほうが安心だと私は考えています。
方法2:rcParamsで日本語フォントを指定する
パッケージを増やさずに直したい場合は、matplotlibの設定(rcParams)で、PCに入っている日本語フォントを指定します。グラフを描く前に、次の1行を書くだけです。
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Meiryo" # 使うフォント名を指定
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 3], label="売上")
ax.set_title("月別の売上")
ax.set_xlabel("月")
ax.legend()
plt.show()
ポイントは、“Meiryo”のところに、自分のPCに実際に入っているフォント名を書くことです。環境ごとのフォント名の例は次のとおりです。
Windowsの場合
Windows 11の私の環境では、次のフォント名でどれも文字化けせずに表示できました。日本語のフォント名(「メイリオ」など)ではなく、英語の名前で指定します。
"Meiryo"(メイリオ)"Yu Gothic"(游ゴシック)"MS Gothic"(MS ゴシック)"BIZ UDGothic"(BIZ UDゴシック)
Macの場合
Macでは、macOSに標準で入っているヒラギノ角ゴシックを使うのが一般的で、フォント名の例は"Hiragino Sans"です。Appleの「macOS Sequoiaに組み込まれているフォント」の一覧にも、Hiragino Sans(W0〜W9)が載っています。私はWindowsで検証しているため、Macでは次の節のコードでmatplotlibから見えるフォント名を確かめてから指定してください。
Google Colabなど日本語フォントが入っていない環境の場合
Google Colabやサーバーのように、日本語フォントが入っているか分からない環境では、方法1のmatplotlib-fontjaを使うのがいちばん手軽です。手元に日本語フォントのファイル(.ttfなど)がある場合は、font_manager.fontManager.addfont()でmatplotlibに登録してから指定することもできます。
import matplotlib.pyplot as plt
from matplotlib import font_manager
font_path = "ipaexg.ttf" # 日本語フォントファイルの場所
font_manager.fontManager.addfont(font_path)
font_name = font_manager.FontProperties(fname=font_path).get_name()
print(font_name) # IPAexGothic
plt.rcParams["font.family"] = font_name
私の環境では、IPAexゴシックのファイル(ipaexg.ttf)を登録するとget_name()が”IPAexGothic”を返し、日本語が正しく表示されました。フォント名を自分で打ち込まずに、ファイルから取り出して使えるのがこの書き方の良いところです。
WindowsとMacの両方で同じコードを使いたいとき
font.familyにはフォント名のリストも渡せます。リストの先頭から順に探して、見つかったフォントが使われます。
plt.rcParams["font.family"] = ["Hiragino Sans", "Meiryo", "IPAexGothic"]
Windowsで試したところ、Hiragino SansとIPAexGothicは見つからないのでfindfont: Font family 'Hiragino Sans' not found.というメッセージが出ますが、Meiryoが使われて日本語は正しく表示されました。逆に、リストのどのフォントも見つからない場合は既定のDejaVu Sansに戻り、文字化けします。「findfont: … not found」が出たら、指定したフォント名が間違っているか、そのPCに入っていないというサインです。
使えるフォントの一覧を確認する方法
「どのフォント名を書けばいいか分からない」ときは、matplotlibが認識しているフォントの一覧を出してみます。
from matplotlib import font_manager
names = sorted({f.name for f in font_manager.fontManager.ttflist})
print(len(names)) # 認識しているフォントの数
for name in names:
print(name)
ここで表示される名前が、そのままrcParams["font.family"]に書ける名前です。一覧が長いときは、日本語フォントによく含まれる文字列で絞り込むと探しやすくなります。
keywords = ["Gothic", "Mincho", "Meiryo", "Hiragino", "IPA", "Noto Sans CJK"]
jp_fonts = [n for n in names if any(k in n for k in keywords)]
print(jp_fonts)
私のWindows 11の環境では、”BIZ UDGothic”、”MS Gothic”、”Meiryo”、”Yu Gothic”などが表示されました。ただし、”Century Gothic”のように名前に「Gothic」が付いていても日本語が入っていない欧文フォントも混ざるので注意してください。
指定したいフォントが実際にどのファイルに当たるのかは、findfont()で確かめられます。
print(font_manager.findfont("Meiryo"))
# 例:C:\Windows\Fonts\meiryo.ttc
なお、matplotlibはフォントの一覧をキャッシュ(matplotlib.get_cachedir()で表示されるフォルダにあるfontlist-v○○○.json)に保存しています。新しくフォントをインストールしたのに一覧に出てこないときは、このファイルを削除してからPythonを起動し直すと、一覧が作り直されます。
seabornと併用するときの注意
seabornを使っている場合、「日本語の設定をしたのに、また□に戻った」ということがよく起きます。原因は、sns.set_theme()(や、その別名のsns.set())がフォントの設定をseabornの既定値で上書きすることです。seabornの基本はSeabornの基礎で解説しています。
実際に、次の順番で書くと文字化けします。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
df = pd.DataFrame({"月": ["1月", "2月", "3月"], "売上": [120, 150, 90]})
plt.rcParams["font.family"] = "Meiryo"
sns.set_theme() # ここでフォント設定が "sans-serif" に戻される
fig, ax = plt.subplots()
sns.barplot(data=df, x="月", y="売上", ax=ax)
ax.set_title("月別の売上")
plt.show()
sns.set_theme()のあとでplt.rcParams["font.family"]を確認すると、”Meiryo”ではなく”sans-serif”に戻っていて、日本語が□になりました。set_theme()にはfontという引数があり、何も指定しないと”sans-serif”が使われるためです。
set_theme(font=…)でフォントも一緒に指定する
いちばん確実なのは、set_theme()のfont引数に日本語フォントを渡すことです。styleなど他の引数と一緒に指定できます。
sns.set_theme(style="whitegrid", font="Meiryo")
matplotlib-fontjaを使っている場合は、同梱フォントの名前である”IPAexGothic”を渡すか、set_theme()のあとでmatplotlib_fontja.japanize()を呼び直します。
import matplotlib_fontja
# 書き方A:フォント名を渡す
sns.set_theme(font="IPAexGothic")
# 書き方B:set_theme() のあとで日本語化し直す
sns.set_theme()
matplotlib_fontja.japanize()
私の環境では、set_theme(font="Meiryo")、set_theme(font="IPAexGothic")、japanize()の呼び直しのどれでも、文字化けの警告が出ずに日本語が表示されました。「フォントの設定は、seabornのテーマ設定のあとに効かせる」と覚えておけば迷いません。seabornの各グラフについては、catplotの使い方やdisplotの使い方も参考にしてください。
まとめ:環境別おすすめの設定
matplotlibの日本語の文字化けは、既定フォントのDejaVu Sansに日本語の字形がないことが原因で、日本語フォントを使うよう設定すれば直ります。環境別のおすすめをまとめると次のとおりです。
| 環境 | いちばん手軽な方法 | パッケージを増やさない方法 |
|---|---|---|
| Windows | import matplotlib_fontja | plt.rcParams["font.family"] = "Meiryo"(”Yu Gothic”なども可) |
| Mac | import matplotlib_fontja | plt.rcParams["font.family"] = "Hiragino Sans"(フォント一覧で名前を確認) |
| Google Colab・サーバー | !pip install matplotlib-fontjaのあとimport matplotlib_fontja | フォントファイルをaddfont()で登録して指定 |
| seabornと併用 | sns.set_theme(font="IPAexGothic") | sns.set_theme(font="Meiryo")など |
| 古いコードでjapanize-matplotlibがエラー | importをmatplotlib_fontjaに書き換える | 応急処置としてpip install setuptools |
私自身は、どの環境でも同じ書き方で済むmatplotlib-fontjaを使うのが楽だと感じています。社内PCなどでパッケージを自由に入れられない場合は、rcParamsでのフォント指定を使い分けるとよいと思います。
参考
- Fonts in Matplotlib(matplotlib公式ドキュメント)
- matplotlib.font_manager(matplotlib公式ドキュメント)
- Customizing Matplotlib with style sheets and rcParams(matplotlib公式ドキュメント)
- seaborn.set_theme(seaborn公式ドキュメント)
- japanize-matplotlib(PyPI)
- uehara1414/japanize-matplotlib(GitHub)
- matplotlib-fontja(PyPI)
- ciffelia/matplotlib-fontja(GitHub)
- What’s New In Python 3.12(Python公式ドキュメント)
- PEP 632 – Deprecate distutils module
- macOS Sequoia に組み込まれているフォント(Apple サポート)
※本記事のコードは2026年10月時点のPython 3.12.1・matplotlib 3.11.2・seaborn 0.13.2(Windows 11)で動作を確認しています。パッケージの更新状況は2026年10月時点のPyPI・GitHubの情報です。バージョンによって挙動や警告の内容が変わる場合があります。
