Matplotlib savefig の使い方: ラベル切れ、bbox_inches、DPI
公開日
更新日

Matplotlib で図を保存するだけなら、まずは fig.savefig("plot.png", dpi=300, bbox_inches="tight") から始めるのが実用的です。日本語の検索では plt.savefig、tight layout、savefig tight などの実装寄りのクエリが多いため、このページでは公式リファレンスの代わりに、保存時によく起きる問題だけを短く整理します。
扱うのは、ラベル切れ、bbox_inches='tight'、layout="constrained"、DPI、PNG/SVG/PDF、そして plt.show() の後に空白画像が保存される問題です。
savefig クイックリファレンス
fig.savefig(
"plot.png",
dpi=300,
bbox_inches="tight",
pad_inches=0.1,
)| 目的 | 使う設定 |
|---|---|
| ラベルやタイトルの切れを直す | bbox_inches="tight" |
| 新しく図を作る | plt.subplots(layout="constrained") |
| 空白画像を避ける | savefig() を plt.show() より前に呼ぶ |
| 余白を減らす | bbox_inches="tight", pad_inches=0 |
| 高解像度 PNG が必要 | dpi=300 |
plt.show() 後に空白画像になる場合
スクリプトや一部のバックエンドでは、plt.show() が figure を閉じたり pyplot から登録解除したりします。その後で plt.savefig() を呼ぶと、空の figure が保存されることがあります。
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 4, 9])
fig.savefig("chart.png", dpi=300, bbox_inches="tight")
plt.show()🧠 なぜこうなるのか
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. 現代的な最有力解 (推奨): layout="constrained" を使う
現在の Matplotlib では、まず layout="constrained" を明示する方法が実用的です。
fig, ax = plt.subplots(layout="constrained")例:

fig, ax = plt.subplots(figsize=(7, 5), layout="constrained")
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、サブプロットとの相性が良い
⚠ 短所
- サブプロット数が非常に多いと、やや計算コストが増える
新しく 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 があると崩れやすい
- 現在は
layout="constrained"のほうが推奨される
✅ 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これにより、異なる環境・マシン間でも一貫した出力が得やすくなります。
📌 まとめ表: どの方法を選べばいい?
| 方法 | 使うべき場面 | 向いている用途 |
|---|---|---|
layout="constrained" | デフォルト推奨 | モダンなレイアウト、サブプロット、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 |
|---|---|---|
![]() | ![]() | ![]() |
よくある質問
-
plt.savefigでラベルが切れるときはどう直しますか? まずplt.savefig("plot.png", dpi=300, bbox_inches="tight")を試します。新しく図を作る場合はplt.subplots(layout="constrained")も有効です。 -
bbox_inches="tight"は何をしますか? 保存時に図の範囲を再計算し、軸ラベル、タイトル、凡例、注釈などを保存画像に含めます。 -
layout="constrained"とbbox_inches='tight'はどう使い分けますか?layout="constrained"は図を作る段階で余白を調整します。bbox_inches='tight'は保存時に切り抜き範囲を調整する即効性のある対処です。 -
plt.show()の後に保存すると画像が空白になるのはなぜですか? 一部の環境ではplt.show()が figure を閉じます。fig.savefig(...)またはplt.savefig(...)を先に呼び、その後でplt.show()を呼びます。 -
保存するときの DPI はいくつがよいですか? Web やスライドなら 150 DPI、レポートや印刷なら 300 DPI が目安です。拡大しても劣化させたくない場合は SVG/PDF を使います。
関連ガイド
- Matplotlib Subplots -- 複数パネルの図を保存する前にレイアウトを整える。
- Matplotlib Figure Size -- インチ、ピクセル、DPI の関係を確認する。
- Matplotlib Histogram -- ヒストグラムをラベル付きで保存する。
- Seaborn Heatmap -- 注釈や colorbar を含む図を保存する。



