Skip to content

Matplotlib-Problem savefig schneidet Beschriftungen ab: Der vollständige Guide 2025

Updated on

Ein vollständiger und aktueller Leitfaden zum Beheben von Matplotlib savefig, das Beschriftungen abschneidet – inklusive tight_layout, constrained_layout, bbox_inches, rcParams und modernen Best Practices.

Wenn du jemals ein Matplotlib-Diagramm hattest, das im Notebook perfekt aussah – aber beim Export mit savefig() abgeschnitten, beschnitten oder mit fehlenden Beschriftungen gespeichert wurde – bist du nicht allein.

Das ist eine der häufigsten Matplotlib-Frustrationen, besonders wenn du Folgendes verwendest:

  • Hohe, mit LaTeX gerenderte Beschriftungen
  • Mehrzeilige Titel
  • Rotierte oder lange Tick-Beschriftungen
  • Subplots mit engem Abstand

In diesem aktualisierten Guide lernst du alle zuverlässigen Methoden, um sicherzustellen, dass deine gespeicherten Grafiken immer Beschriftungen, Titel und Annotationen vollständig enthalten – mit modernen Best Practices, auf die du dich verlassen kannst.


🧠 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): constrained_layout=True verwenden

Seit Matplotlib 3.6+ (und weiterhin in 3.8+ im Jahr 2025) ist die empfohlene Layout-Methode:

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

Beispiel:

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

✔ 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 2025 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
  • constrained_layout=True 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
constrained_layout=True**Standardwahl **Modernes 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äufig gestellte Fragen

  1. Warum werden meine Beschriftungen beim Speichern einer Matplotlib-Grafik abgeschnitten?
    Weil Matplotlib die Figure-Leinwand nicht automatisch vergrößert, wenn Beschriftungen außerhalb der Achsen liegen. Das tritt häufig bei LaTeX-Beschriftungen oder rotiertem Text auf.

  2. Welche Methode behebt das Abschneiden von Beschriftungen im Jahr 2025 am zuverlässigsten?
    Verwende constrained_layout=True für modernen Code oder bbox_inches='tight' als schnellen Fix beim Export.

  3. Was macht bbox_inches="tight"?
    Es berechnet den Bounding-Box-Ausschnitt beim Speichern neu und stellt sicher, dass alle Textelemente enthalten sind.