FPプログラミング

『日本語入りのグラフをささっと作る』~matplotlibのハマりポイント、日本語文字化けの解消方法~

matplotlibはPythonの可視化ライブラリで、折れ線・棒・円グラフなど多様な図を描け、統計やFP分析の結果を視覚的に整理できる便利なライブラリです。

ですが、グラフ内に日本語を使うと、たいてい最初は日本語を文字化けさせてしまいます。

OSにインストールされた日本語フォントを検索して選択し、文字化けしないようにするひな型を作成しました。

ソースコードのご使用は、自己責任でお願いします。

当サイトに掲載している計算ツールは、学習および一般的な情報提供を目的としています。
計算結果は、制度改正や個別の事情により実際とは異なる場合があり、かつ、本ツールでの計算結果をもとにして、申告や意思決定を行うことはできません。
また、個別具体的な税額計算や申告に関しては、必ず税理士その他の専門家にご相談ください。
詳細は免責事項ページをご覧ください。

なぜ文字化けするのか

matplotlibのデフォルトのフォントは、サンセリフ体のDejaVu Sansになっています。

すっきりとしていて見やすいフォントなので、グラフに使うフォントとしてはとてもいいです。

ただし、日本語文字に対応していませんので、日本語をグラフに描画すると文字化けしてしまうのです。

日本語文字化けの解消方法

日本語で正しくグラフ内で表示させるためには、日本語に対応しているフォントをmatplotlibに設定することで解決します。

matplotlibのfont_managerrcParamsをimportして、実行環境にインストールされていると思われる日本語フォント名を順番に検索し、ヒットしたら設定するようにします。

OSにより、インストールされていると思われる日本語フォント名が異なるので、様々なフォント名を羅列しておくと汎用的です。

# --- 日本語フォント候補(OS横断・よくある名称)---
jp_font_candidates = [
    # IPA / Noto 系
    "IPAexGothic", "IPAGothic",
    "Noto Sans CJK JP", "Noto Sans JP",
    "Noto Serif CJK JP", "Noto Serif JP",
    # Windows 系
    "Yu Gothic", "YuGothic", "Meiryo", "MS Gothic", "MS PGothic",
    # macOS 系
    "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro",
    # Linux ディストリの別名
    "TakaoGothic", "VL PGothic"
]

その他のありがちなハマりごとも解消

その他、matplotlibでハマりがちな、2つのことも解消しておきます。

  1. グラフ外が透過してしまう
    白で塗りつぶして保存するようにすれば、解消します。
  2. グラフ描画すると、PNGにグラフが描画されていない
    PNGに保存してからグラフ描画する順番にすれば、解決します。

まとめると、こんな感じで記述すればよいです。

# --- ここがポイント:白背景をデフォルトに固定 ---
rcParams["savefig.transparent"] = False
rcParams["savefig.facecolor"]  = "white"
rcParams["figure.facecolor"]   = "white"
rcParams["axes.facecolor"]     = "white"
...
...
# --- PNG保存(白で塗りつぶし)---
# 重要:transparent=False と facecolor を指定
fig.savefig(
    "sample_plot.png",
    dpi=300,
    bbox_inches="tight",
    transparent=False,
    facecolor=fig.get_facecolor(),
    edgecolor="white",
)

# --- 画面表示 ---
plt.show()

雛型ソースコードでささっと作業

日本語の文字化け、その他のありがちなハマりごとも解消する簡単なソースコードを作成しました。

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from matplotlib import font_manager, rcParams

def set_japanese_font():
    jp_font_candidates = [
        # IPA / Noto 系
        "IPAexGothic", "IPAGothic",
        "Noto Sans CJK JP", "Noto Sans JP",
        "Noto Serif CJK JP", "Noto Serif JP",
        # Windows 系
        "Yu Gothic", "YuGothic", "Meiryo", "MS Gothic", "MS PGothic",
        # macOS 系
        "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro",
        # Linux ディストリの別名
        "TakaoGothic", "VL PGothic"
    ]
    available_fonts = {f.name for f in font_manager.fontManager.ttflist}
    for name in jp_font_candidates:
        if name in available_fonts:
            rcParams["font.family"] = name
            rcParams["axes.unicode_minus"] = False
            print(f"[INFO] 日本語フォントを設定しました: {name}")
            break
    else:
        print("[WARN] 日本語フォントが見つかりませんでした。")

# --- ここがポイント:白背景をデフォルトに固定 ---
rcParams["savefig.transparent"] = False
rcParams["savefig.facecolor"]  = "white"
rcParams["figure.facecolor"]   = "white"
rcParams["axes.facecolor"]     = "white"

set_japanese_font()

# --- プロット ---
x = [1, 2, 3, 4, 5]
y = [10, 8, 11, 9, 12]

fig = plt.figure(figsize=(6, 4), facecolor="white")  # 念のため明示
ax = fig.add_subplot(111)
ax.plot(x, y, marker="o", label="サンプル系列")
ax.set_title("日本語も文字化けしません")
ax.set_xlabel("横軸(サンプル)")
ax.set_ylabel("縦軸(サンプル)")
ax.legend()
ax.annotate("ここ!", xy=(3, 11), xytext=(3.6, 11.5),
            arrowprops=dict(arrowstyle="->", lw=1.2))
fig.tight_layout()

# --- PNG保存(白で塗りつぶし)---
# 重要:transparent=False と facecolor を指定
fig.savefig(
    "sample_plot.png",
    dpi=300,
    bbox_inches="tight",
    transparent=False,
    facecolor=fig.get_facecolor(),
    edgecolor="white",
)

# --- 画面表示 ---
plt.show()

実行結果は、以下です。

これらの記述をひな型として使うことで、matplotlib、もう迷いません。

ABOUT ME
fp. てらさん
50代後半となり、「人生、いつからでも新しいことに挑戦できる」と思い立って、力試しのつもりで資格を少しずつ取りました。 2025年夏に2級FP技能士・AFP資格に合格し、現在は生活の役に立つお金のさまざまなことを勉強中です。 「熾き火のように静かで熱く、のんびり楽しく暮らす」――そんな思いで、日々を熱く楽しんでいます。