Skip to content

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

AnsatzWann nutzenVorteileAchtung
twinx / twinyZwei unabhängige Reihen teilen nur x- (oder y-) PositionenSchnell, wenig CodeTick-Formatierung manuell, keine automatische Skalensynchronisierung
secondary_yaxis / secondary_xaxisReihen sind konvertierbar (z. B. °C ↔ °F)Tick-Ausrichtung über Vorwärts-/Rück-Funktion garantiertPräzise Umrechnungen nötig; nur für monotone Konversionen
Zwei Subplots mit shared axesLeser sollen vergleichen ohne ÜberlagerungKlarer getrenntMehr 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 legend aufrufst.
  • Nutze tight_layout() oder constrained_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 legend aufrufen.
  • Abgeschnittene Labels? constrained_layout=True oder plt.tight_layout() setzen.
  • Tick-Farben inkonsistent? tick_params(labelcolor=...) auf beide Achsen anwenden.