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

ノートブック上では完璧に見えていた Matplotlib のプロットが、savefig() で保存した途端に
一部が切れたり、ラベルが欠けたり、文字がクリップされたり したことがあるなら、それはよくある問題です。
この問題は特に次のような場合によく起こります。
- LaTeX 風にレンダリングされた背の高いラベル
- 複数行のタイトル
- 回転させた、あるいは長い目盛りラベル
- 間隔の狭いサブプロット
このガイドでは、保存した図にラベル・タイトル・注釈が必ず含まれるようにする
あらゆる確実な方法を、2025 年時点のベストプラクティスとともに説明します。
🧠 なぜこうなるのか
Matplotlib は、ラベルが座標軸領域からはみ出しても、
図全体のキャンバスを自動では拡張しません。
よくある原因:
- 背の高い記号を含む LaTeX 風数式
- 大きな
fontsize - 長い、もしくは回転させた目盛りラベル
- 余白の小さいサブプロット配置
例:

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)例:

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)ラベルが重ならず、切れなくなるまで値を少しずつ増やして調整します。

✅ 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")いつ使うか
- レイアウトをいじらずに、保存時だけ手っ取り早く直したいとき
- 画面に見えているものを、ファイルにもそのまま確実に含めたいとき

✅ 5. rcParams で自動レイアウトを有効にする
すべての図に対して、恒久的に対策したい場合:

実行時に rcParams を更新する:
from matplotlib import rcParams
rcParams.update({"figure.autolayout": True})もしくは matplotlibrc に設定する:
figure.autolayout : Trueこれにより、異なる環境・マシン間でも一貫した出力が得やすくなります。
📌 まとめ表: どの方法を選べばいい?
| 方法 | 使うべき場面 | 向いている用途 |
|---|---|---|
constrained_layout=True | 2025 年時点のデフォルト推奨 | モダンなレイアウト、サブプロット、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 です。
使い方は次の通りです。
pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)オンラインで試すこともできます:
| Kaggle | Google Colab | GitHub |
|---|---|---|
![]() | ![]() | ![]() |
❓ よくある質問 (FAQ)
-
なぜ Matplotlib で図を保存するとラベルが切れてしまうのですか?
ラベルが座標軸の外側にはみ出しても、Matplotlib はキャンバスのサイズを自動調整しないためです。特に LaTeX 風ラベル、回転させたテキスト、大きなフォントサイズを使うときに起こりやすくなります。 -
2025 年時点で、最も確実にラベルのクリッピングを防げる方法はどれですか?
新しいコードではconstrained_layout=Trueを使うのがおすすめです。保存時だけの素早い対処ならbbox_inches='tight'を指定する方法も有効です。 -
bbox_inches="tight"は何をしているのですか?
保存時に図全体の bounding box を再計算し、すべてのテキスト要素 (ラベル、タイトル、注釈など) が保存画像に含まれるようにします。



