Skip to content

Matplotlib savefig の使い方: ラベル切れ、bbox_inches、DPI

公開日

更新日

plt.savefig / fig.savefig の実用リファレンス。ラベル切れを bbox_inches='tight' で直し、DPI、PNG/SVG/PDF、plt.show() 後の空白画像を確認します。

Matplotlib で図を保存するだけなら、まずは fig.savefig("plot.png", dpi=300, bbox_inches="tight") から始めるのが実用的です。日本語の検索では plt.savefigtight layoutsavefig 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
  • 長い、もしくは回転させた目盛りラベル
  • 余白の小さいサブプロット配置

例:

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. 現代的な最有力解 (推奨): layout="constrained" を使う

現在の Matplotlib では、まず layout="constrained" を明示する方法が実用的です。

fig, ax = plt.subplots(layout="constrained")

例:

matplotlib-constrained-layout-example.png

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)

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

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 があると崩れやすい
  • 現在は layout="constrained" のほうが推奨される

✅ 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

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


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

方法使うべき場面向いている用途
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 です。

PyGWalker for Data visualization (opens in a new tab)

使い方は次の通りです。

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

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

KaggleGoogle ColabGitHub

よくある質問

  1. plt.savefig でラベルが切れるときはどう直しますか? まず plt.savefig("plot.png", dpi=300, bbox_inches="tight") を試します。新しく図を作る場合は plt.subplots(layout="constrained") も有効です。

  2. bbox_inches="tight" は何をしますか? 保存時に図の範囲を再計算し、軸ラベル、タイトル、凡例、注釈などを保存画像に含めます。

  3. layout="constrained"bbox_inches='tight' はどう使い分けますか? layout="constrained" は図を作る段階で余白を調整します。bbox_inches='tight' は保存時に切り抜き範囲を調整する即効性のある対処です。

  4. plt.show() の後に保存すると画像が空白になるのはなぜですか? 一部の環境では plt.show() が figure を閉じます。fig.savefig(...) または plt.savefig(...) を先に呼び、その後で plt.show() を呼びます。

  5. 保存するときの DPI はいくつがよいですか? Web やスライドなら 150 DPI、レポートや印刷なら 300 DPI が目安です。拡大しても劣化させたくない場合は SVG/PDF を使います。

関連ガイド