Skip to content

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

AufgabeWerkzeugWarum
Punkt mit Pfeil markierenannotateText und Pfeil in einem Aufruf
Freitext in AchsenkoordinatentextTitel, Panel-Labels, Hinweise
Balken automatisch labelnbar_labelVerankert Labels direkt an Balken
Labels im Plot haltenclip_on=True, OffsetsVerhindert, dass Text aus der Achse ragt
Text umbrechen/formatierentextwrap.fill, f-StringsKü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 xytext leicht 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:

  • padding steuert 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.transAxes bleiben Positionen (0–1) relativ zur Achse, auch nach Resize.
  • clip_on=True setzen, wenn Text im Plot bleiben muss.
  • ha/va ausrichten und kurze Zeilenumbrüche nutzen, um Kantenkollisionen zu vermeiden.

Schnelle Fehlerliste

  • Labels überlappen? Schrift verkleinern, padding anpassen oder leicht rotieren.
  • Pfeil fehlt? zorder erhöhen oder Annotation nach Flächen zeichnen.
  • Text ragt heraus? constrained_layout=True aktivieren oder lange Labels mit textwrap.fill kürzen.