Skip to content

Matplotlib の savefig でラベルが切れる問題を直す: 完全ガイド 2025

Updated on

tight_layout、constrained_layout、bbox_inches、rcParams などを含む、Matplotlib の savefig でラベルが切られる問題を解決するための最新かつ完全なガイド。

ノートブック上では完璧に見えていた Matplotlib のプロットが、savefig() で保存した途端に
一部が切れたり、ラベルが欠けたり、文字がクリップされたり したことがあるなら、それはよくある問題です。

この問題は特に次のような場合によく起こります。

  • LaTeX 風にレンダリングされた背の高いラベル
  • 複数行のタイトル
  • 回転させた、あるいは長い目盛りラベル
  • 間隔の狭いサブプロット

このガイドでは、保存した図にラベル・タイトル・注釈が必ず含まれるようにする
あらゆる確実な方法を、2025 年時点のベストプラクティスとともに説明します。


🧠 なぜこうなるのか

Matplotlib は、ラベルが座標軸領域からはみ出しても、
図全体のキャンバスを自動では拡張しません

よくある原因:

  • 背の高い記号を含む LaTeX 風数式
  • 大きな fontsize
  • 長い、もしくは回転させた目盛りラベル
  • 余白の小さいサブプロット配置

例:

matplotlib-savefig-label-clipping-example

import matplotlib.pyplot as plt
 
plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$', fontsize=50)
plt.title('Example with matplotlib 3.4.2\nLabel clipping example')
plt.show()

この例では ylabel は見えますが、保存した図では xlabel途中で切れてしまうことがよくあります。


✅ 1. 現代的な最有力解 (推奨): constrained_layout=True を使う

Matplotlib 3.6 以降 (2025 年時点の 3.8+ でも) 推奨されているレイアウト方法は次の通りです。

fig, ax = plt.subplots(constrained_layout=True)

例:

matplotlib-constrained-layout-example.png

fig, ax = plt.subplots(figsize=(7, 5), constrained_layout=True)
ax.set_xlabel("Very long bottom label that usually gets clipped", fontsize=16)
ax.set_ylabel("Tall math label:\n$\\frac{x_a - x_b}{x_c}$")
fig.savefig("figure.png")

✔ 長所

  • 現代的で安定している
  • tight_layout() よりうまく動くことが多い
  • colorbar や legend、サブプロットとの相性が良い

⚠ 短所

  • サブプロット数が非常に多いと、やや計算コストが増える

2025 年に新しく Matplotlib のコードを書くなら、これをデフォルトの選択にするのがおすすめです。


✅ 2. subplots_adjust で余白を手動調整する

シンプルかつ効果的な古典的手法です。

plt.subplots_adjust(bottom=0.15)

もしくは figure 経由で:

plt.gcf().subplots_adjust(bottom=0.18)

ラベルが重ならず、切れなくなるまで値を少しずつ増やして調整します。

matplotlib-subplots-adjust-margins.png


✅ 3. tight_layout() を使う (古いがまだ有用)

tight_layout() は余白を自動調整してくれます。

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
for ax in axes.flatten():
    ax.set_xlabel("Example X label")
    ax.set_ylabel("Example Y label")
 
plt.tight_layout()
plt.show()

メモ

  • シンプルな図やサブプロットには十分役に立つ
  • legend や colorbar があると崩れやすい
  • 現在は constrained_layout=True のほうが推奨される

✅ 4. bbox_inches="tight" 付きで保存する (手早い対処法)

ラベルの切れを防ぐためによく使われる方法です。

plt.savefig("myfile.png", bbox_inches="tight")

いつ使うか

  • レイアウトをいじらずに、保存時だけ手っ取り早く直したいとき
  • 画面に見えているものを、ファイルにもそのまま確実に含めたいとき

matplotlib-tight-layout-subplots.png


✅ 5. rcParams で自動レイアウトを有効にする

すべての図に対して、恒久的に対策したい場合:

matplotlib-bbox-inches-tight-example.png

実行時に rcParams を更新する:

from matplotlib import rcParams
rcParams.update({"figure.autolayout": True})

もしくは matplotlibrc に設定する:

figure.autolayout : True

これにより、異なる環境・マシン間でも一貫した出力が得やすくなります。


📌 まとめ表: どの方法を選べばいい?

方法使うべき場面向いている用途
constrained_layout=True2025 年時点のデフォルト推奨モダンなレイアウト、サブプロット、legend
bbox_inches='tight'保存時に素早く直したいとき単一プロットのエクスポート
tight_layout()既存のレガシーコードシンプルなサブプロット配置
subplots_adjust()余白を完全に手動調整したいとき論文・出版向けの細かなレイアウト調整
figure.autolayout=Trueプロジェクト全体のデフォルト環境をまたいだ一貫性の確保

💡 完璧な図を作るための追加のコツ

✔ 長いラベルには高めの DPI を併用する

plt.savefig("fig.png", dpi=200, bbox_inches="tight")

✔ 必要以上に大きなフォントサイズは避ける

フォントが大きすぎると、ラベルがはみ出しやすくなります。

✔ colorbar を使う場合は constrained_layout を優先

colorbar との組み合わせでは、tight_layout より constrained_layout のほうがうまく配置されることが多いです。


📊 手動レイアウト調整なしで可視化を作る (PyGWalker)

もしあなたが主に DataFrame を可視化する目的で Matplotlib を使っているなら、
そもそも手動でレイアウト調整をする必要がないかもしれません。

次のようにするだけで:

  • DataFrame を読み込んで
  • フィールドをドラッグ&ドロップし
  • 即座にチャートを生成

といった操作が可能です。

それを実現するのが、オープンソースの可視化ツール PyGWalker です。

PyGWalker for Data visualization (opens in a new tab)

使い方は次の通りです。

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

オンラインで試すこともできます:

KaggleGoogle ColabGitHub

❓ よくある質問 (FAQ)

  1. なぜ Matplotlib で図を保存するとラベルが切れてしまうのですか?
    ラベルが座標軸の外側にはみ出しても、Matplotlib はキャンバスのサイズを自動調整しないためです。特に LaTeX 風ラベル、回転させたテキスト、大きなフォントサイズを使うときに起こりやすくなります。

  2. 2025 年時点で、最も確実にラベルのクリッピングを防げる方法はどれですか?
    新しいコードでは constrained_layout=True を使うのがおすすめです。保存時だけの素早い対処なら bbox_inches='tight' を指定する方法も有効です。

  3. bbox_inches="tight" は何をしているのですか?
    保存時に図全体の bounding box を再計算し、すべてのテキスト要素 (ラベル、タイトル、注釈など) が保存画像に含まれるようにします。