Skip to content

plt.savefig in Python: bbox_inches, DPI und abgeschnittene Labels

Veröffentlicht am

Aktualisiert am

Praktische Matplotlib-savefig-Hilfe: Labels mit bbox_inches='tight' reparieren, DPI/PNG/SVG/PDF wählen und leere Bilder nach plt.show() vermeiden.

Wenn du eine Matplotlib-Grafik speichern willst, ist fig.savefig("plot.png", dpi=300, bbox_inches="tight") der beste Startpunkt. Die deutschen GSC-Daten zeigen vor allem Sichtbarkeit für plt.savefig, plt savefig, python savefig und pyplot savefig, deshalb ist diese Seite als praktische Kurzreferenz optimiert, nicht als allgemeine API-Dokumentation.

Sie erklärt abgeschnittene Labels, bbox_inches='tight', layout="constrained", DPI, PNG/SVG/PDF und leere Bilder nach plt.show().

savefig-Kurzreferenz

fig.savefig(
    "plot.png",
    dpi=300,
    bbox_inches="tight",
    pad_inches=0.1,
)
ProblemZuerst versuchen
Labels, Titel oder Legende abgeschnittenbbox_inches="tight"
Neuer Matplotlib-Codeplt.subplots(layout="constrained")
Gespeichertes Bild ist leersavefig() vor plt.show() aufrufen
Zu viel Rand um die Grafikbbox_inches="tight", pad_inches=0
Hochauflösende Ausgabedpi=300 oder SVG/PDF

Leeres Bild nach plt.show(): zuerst speichern

In vielen Skripten kann ein blockierendes plt.show() die Figure schließen oder aus pyplot entfernen. Wenn du danach plt.savefig() aufrufst, wird möglicherweise eine neue, leere Figure gespeichert.

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 4, 9])
fig.savefig("chart.png", dpi=300, bbox_inches="tight")
plt.show()

🧠 Warum das passiert

Matplotlib vergrößert die Figure-Leinwand nicht automatisch, wenn Beschriftungen über die Achsen hinaus ragen. Häufige Ursachen sind:

  • LaTeX-Ausdrücke, die hohe Symbole erzeugen
  • Große fontsize-Werte
  • Lange oder rotierte Tick-Beschriftungen
  • Dichte Subplot-Gitter

Beispiel:

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()

Die y-Achsenbeschriftung ist sichtbar, aber die x-Achsenbeschriftung wird in der gespeicherten Grafik oft abgeschnitten.


✅ 1. Moderne Standardlösung (empfohlen): layout="constrained" verwenden

In aktuellem Matplotlib ist eine klare Art, das empfohlene Layout zu aktivieren:

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

Beispiel:

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")

✔ Vorteile

  • Modern und stabil
  • Funktioniert besser als tight_layout()
  • Funktioniert gut mit Colorbars, Legenden und Subplots

⚠ Nachteile

  • Etwas langsamer bei großen Subplot-Grids

Wenn du neuen Matplotlib-Code schreibst, sollte dies deine Standardwahl sein.


✅ 2. Ränder manuell mit subplots_adjust anpassen

Immer noch eine einfache und wirksame Methode:

plt.subplots_adjust(bottom=0.15)

Oder an der Figure:

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

Erhöhe den Randwert, bis Beschriftungen nicht mehr überlappen oder abgeschnitten werden.

matplotlib-subplots-adjust-margins.png


✅ 3. tight_layout() verwenden (älter, aber noch nützlich)

tight_layout() passt Abstände automatisch an:

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()

Hinweise

  • Gut für einfache Plots
  • Kann mit Legenden und Colorbars Probleme haben
  • layout="constrained" ist inzwischen die bevorzugte Lösung

✅ 4. Speichern mit bbox_inches="tight" (sehr guter Schnellfix)

Eine vielgenutzte Lösung gegen Abschneiden:

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

Wann verwenden?

  • Schneller Fix, ohne das Layout zu ändern
  • Stellt sicher, dass alles, was auf dem Bildschirm sichtbar wäre, auch in der Datei landet

matplotlib-tight-layout-subplots.png


✅ 5. Automatisches Layout mit rcParams aktivieren

Wenn du eine dauerhafte Lösung möchtest, die für alle Plots gilt: matplotlib-bbox-inches-tight-example.png

rcParams zur Laufzeit aktualisieren:

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

ODER matplotlibrc konfigurieren:

figure.autolayout : True

Das hilft, konsistente Ergebnisse über verschiedene Systeme hinweg zu erzielen.


📌 Übersichtstabelle: Welche Methode sollte ich verwenden?

MethodeWann verwendenAm besten geeignet für
layout="constrained"StandardwahlModernes Layout, Subplots, Legenden
bbox_inches='tight'Schneller Fix beim SpeichernExporte einzelner Plots
tight_layout()Legacy-CodeEinfache Subplot-Grids
subplots_adjust()Volle manuelle Kontrolle gewünschtFeintuning für Publikationsgrafiken
figure.autolayout=TrueProjektweiter StandardKonsistenz über Systeme hinweg

💡 Zusätzliche Tipps für perfekte Grafiken

✔ Höhere DPI verwenden, um Probleme mit langen Beschriftungen zu reduzieren

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

✔ Extrem große Schriftgrößen vermeiden

Sehr große Fonts erhöhen die Wahrscheinlichkeit, dass etwas abgeschnitten wird.

✔ Für Colorbars: constrained_layout verwenden

Das funktioniert deutlich besser als tight_layout.


📊 Visualisierungen ohne manuelles Layout-Fixing erstellen (PyGWalker)

Wenn du Matplotlib hauptsächlich nutzt, um DataFrames zu visualisieren, musst du Layouts möglicherweise gar nicht mehr manuell anpassen.

Du kannst einfach:

  • Deinen DataFrame laden
  • Felder per Drag-and-Drop anordnen
  • Diagramme sofort generieren

Mit PyGWalker, einem Open-Source-Visualisierungstool:

PyGWalker for Data visualization (opens in a new tab)

So verwendest du es:

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

Oder probiere es online aus:

KaggleGoogle ColabGitHub

Häufige Fragen

  1. Wie verhindere ich abgeschnittene Labels bei plt.savefig? Speichere mit bbox_inches='tight', zum Beispiel plt.savefig("plot.png", dpi=300, bbox_inches="tight"). Für neuen Code ist plt.subplots(layout="constrained") oft stabiler.

  2. Was macht bbox_inches="tight"? Es berechnet den gespeicherten Bereich neu, sodass Labels, Titel, Legenden und Annotationen außerhalb der Achsen mit exportiert werden.

  3. Wann nutze ich layout="constrained" statt bbox_inches='tight'? layout="constrained" ist besser beim Erstellen neuer Figures mit Subplots, Colorbars oder Legenden. bbox_inches='tight' ist der schnelle Export-Fix.

  4. Warum ist mein Bild nach plt.show() leer? Manche Backends schließen die Figure bei plt.show(). Rufe zuerst fig.savefig(...) oder plt.savefig(...) auf und danach plt.show().

  5. Welche DPI sollte ich für savefig verwenden? 150 DPI reichen oft für Web und Präsentationen, 300 DPI für Berichte und Druck. Für skalierbare Grafiken nutze SVG oder PDF.

Verwandte Guides