Matplotlib Sekundärachse: twinx vs secondary_yaxis erklärt
Updated on
Wenn ein Plot zwei Skalen braucht (Dollar vs. Stück, Celsius vs. Fahrenheit) und die zweite Achse falsch gesetzt wird, entstehen Fehlinterpretationen. Versetzte Ticks, widersprüchliche Legenden und abgeschnittene Labels sind typische Fallen. Die Lösung ist simpel: das richtige Dual-Achsen-Werkzeug wählen und eine klare Umrechnung hinterlegen, damit beide Skalen ehrlich bleiben.
Schnelle Entscheidungshilfe
| Ansatz | Wann nutzen | Vorteile | Achtung |
|---|---|---|---|
twinx / twiny | Zwei unabhängige Reihen teilen nur x- (oder y-) Positionen | Schnell, wenig Code | Tick-Formatierung manuell, keine automatische Skalensynchronisierung |
secondary_yaxis / secondary_xaxis | Reihen sind konvertierbar (z. B. °C ↔ °F) | Tick-Ausrichtung über Vorwärts-/Rück-Funktion garantiert | Präzise Umrechnungen nötig; nur für monotone Konversionen |
| Zwei Subplots mit shared axes | Leser sollen vergleichen ohne Überlagerung | Klarer getrennt | Mehr Platz, eigene Legenden je Subplot |
Rezept: twinx für zwei y-Skalen
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 13)
sales = np.array([12, 18, 25, 30, 28, 35, 40, 38, 32, 28, 22, 18])
customers = np.array([120, 155, 180, 210, 205, 230, 245, 240, 225, 200, 175, 150])
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(x, sales, color="tab:blue", label="Sales (k$)")
ax.set_xlabel("Monat")
ax.set_ylabel("Sales (k$)", color="tab:blue")
ax.tick_params(axis="y", labelcolor="tab:blue")
ax2 = ax.twinx()
ax2.plot(x, customers, color="tab:orange", label="Kunden")
ax2.set_ylabel("Kunden", color="tab:orange")
ax2.tick_params(axis="y", labelcolor="tab:orange")
lines = ax.get_lines() + ax2.get_lines()
labels = [line.get_label() for line in lines]
ax.legend(lines, labels, loc="upper left")
plt.tight_layout()
plt.show()Tipps:
- Verwende getrennte Farben pro Achse, damit die Legende eindeutig bleibt.
- Sammle Linien beider Achsen, bevor du
legendaufrufst. - Nutze
tight_layout()oderconstrained_layout=True, um abgeschnittene Labels zu vermeiden.
Rezept: secondary_yaxis mit sicheren Umrechnungen
import matplotlib.pyplot as plt
import numpy as np
temps_c = np.linspace(-20, 40, 200)
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(temps_c, np.sin(temps_c / 10), color="tab:blue", label="Signal vs °C")
ax.set_xlabel("Temperatur (°C)")
ax.set_ylabel("Signal")
def c_to_f(c):
return c * 9/5 + 32
def f_to_c(f):
return (f - 32) * 5/9
ax_f = ax.secondary_xaxis("top", functions=(c_to_f, f_to_c))
ax_f.set_xlabel("Temperatur (°F)")
ax.legend(loc="lower right")
plt.tight_layout()
plt.show()Tipps:
- Immer Vorwärts- und Rück-Funktionen setzen, damit Ticks ausgerichtet bleiben.
- Nur monotone, invertierbare Umrechnungen nutzen.
- Ticks formatieren (z. B.
ax_f.xaxis.set_major_formatter("{x:.0f}°F")) für Klarheit.
Skalen ehrlich halten
- Dual-Achsen meiden, wenn Reihen nicht verwandt sind; getrennte Subplots sind oft klarer.
- Auf irreführende Steigungen prüfen: Wenn eine Reihe dominiert, zuerst normalisieren.
- Nur Gridlines der Primärachse aktivieren, um visuelles Rauschen zu reduzieren.
Troubleshooting-Checkliste
- Doppelte Legenden? Linien beider Achsen kombinieren und dann
legendaufrufen. - Abgeschnittene Labels?
constrained_layout=Trueoderplt.tight_layout()setzen. - Tick-Farben inkonsistent?
tick_params(labelcolor=...)auf beide Achsen anwenden.