Matplotlib Annotations und Text: Insights klar hervorheben
Updated on
Unmarkierte Peaks oder Balken zwingen Leser zum Raten. Überlappende oder abdriftende Texte verwischen die Botschaft. Klare Annotations lösen das Problem: kurze Labels, gut platzierte Pfeile und konsistente Fonts, die Aufmerksamkeit lenken ohne zu stören.
Das passende Textwerkzeug wählen
| Aufgabe | Werkzeug | Warum |
|---|---|---|
| Punkt mit Pfeil markieren | annotate | Text und Pfeil in einem Aufruf |
| Freitext in Achsenkoordinaten | text | Titel, Panel-Labels, Hinweise |
| Balken automatisch labeln | bar_label | Verankert Labels direkt an Balken |
| Labels im Plot halten | clip_on=True, Offsets | Verhindert, dass Text aus der Achse ragt |
| Text umbrechen/formatieren | textwrap.fill, f-Strings | Kürzt Labels und hält sie lesbar |
Peaks mit Pfeilen markieren
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 300)
y = np.sin(x) * np.exp(-x / 5)
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, y, color="tab:blue")
peak_idx = np.argmax(y)
peak_x, peak_y = x[peak_idx], y[peak_idx]
ax.annotate(
"Peak signal",
xy=(peak_x, peak_y),
xytext=(peak_x + 1.2, peak_y + 0.2),
arrowprops=dict(arrowstyle="->", color="tab:red", lw=1.5),
bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="tab:red", alpha=0.9),
fontsize=10,
color="tab:red",
)
ax.set_xlabel("Time (s)")
ax.set_ylabel("Amplitude")
ax.grid(True, linestyle="--", alpha=0.3)
plt.tight_layout()
plt.show()Tipps:
- Text per
xytextleicht versetzen, damit Pfeile kurz und lesbar bleiben. - Heller Hintergrund (
bbox) schafft Kontrast auf dichten Plots. - Kurz halten (2–4 Wörter), um Daten nicht zu verdecken.
Balken ohne Überlappung labeln
import matplotlib.pyplot as plt
items = ["A", "B", "C", "D"]
values = [28, 35, 30, 22]
fig, ax = plt.subplots(figsize=(6, 4))
bars = ax.bar(items, values, color="tab:purple", alpha=0.9)
ax.bar_label(bars, labels=[f"{v}k" for v in values], padding=3)
ax.set_ylabel("Units sold")
ax.set_ylim(0, 40)
plt.tight_layout()
plt.show()Tipps:
paddingsteuert Abstand zur Balkenspitze; negativ für Labels im Balken.- Bei gestapelten Balken
label_type="center"nutzen. - Bei kleinen Werten Textfarbe auf weiß ändern und Labels innen platzieren.
Inline-Notizen sicher platzieren
ax.text(
0.02, 0.95, "Experiment 3\nn=120",
transform=ax.transAxes,
ha="left", va="top",
fontsize=9,
bbox=dict(boxstyle="round", fc="white", ec="0.7", alpha=0.8)
)Hinweise:
- Mit
transform=ax.transAxesbleiben Positionen (0–1) relativ zur Achse, auch nach Resize. clip_on=Truesetzen, wenn Text im Plot bleiben muss.ha/vaausrichten und kurze Zeilenumbrüche nutzen, um Kantenkollisionen zu vermeiden.
Schnelle Fehlerliste
- Labels überlappen? Schrift verkleinern,
paddinganpassen oder leicht rotieren. - Pfeil fehlt?
zordererhöhen oder Annotation nach Flächen zeichnen. - Text ragt heraus?
constrained_layout=Trueaktivieren oder lange Labels mittextwrap.fillkürzen.