Matplotlib Achsenticks und Formatter: Skalen lesbar machen
Updated on
Gedrängte Ticks, überlappende Datumswerte und krumme Zahlen machen Plots unruhig und schwer lesbar. Wenn Ticks zufällig landen, geht Kontext verloren. Lösung: Locators (wo Ticks sitzen) und Formatter (wie Ticks aussehen) bewusst setzen, damit jede Achse eine klare Geschichte erzählt.
Locator vs Formatter im Überblick
| Aufgabe | Werkzeug | Beispiel |
|---|---|---|
| Tick-Abstand per Schritt setzen | MultipleLocator | Alle 5 Einheiten auf x |
| Maximalanzahl begrenzen | MaxNLocator | Höchstens 6 Ticks auf y |
| Datumsticks | AutoDateLocator | Automatisch Monate/Jahre |
| Eigene Beschriftung | FuncFormatter | Einheiten anhängen, Suffix |
| Labels drehen | tick_params(rotation=...) | 45° bei dichten Datumswerten |
Numerische Achsen: Abstände und Labels steuern
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FuncFormatter
import numpy as np
x = np.linspace(0, 50, 200)
y = np.log1p(x) * 3.2
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, y, color="tab:blue")
# Ticks alle 10 auf x, alle 1.5 auf y
ax.xaxis.set_major_locator(MultipleLocator(10))
ax.yaxis.set_major_locator(MultipleLocator(1.5))
# Label mit Einheit
ax.yaxis.set_major_formatter(FuncFormatter(lambda val, _: f"{val:.1f} dB"))
ax.set_xlabel("Samples")
ax.set_ylabel("Signal (dB)")
ax.grid(True, axis="both", linestyle="--", alpha=0.3)
plt.tight_layout()
plt.show()Tipps:
MaxNLocator(nbins=6)hält Achsen auch bei variabler Spanne sauber.- Formatter ändern nur Text, nicht die Tick-Position.
- Einheiten entweder im Label oder im Formatter platzieren, nicht doppelt.
Datumsachsen: Überlappung vermeiden
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
dates = pd.date_range("2024-01-01", periods=120, freq="D")
values = pd.Series(range(len(dates))).rolling(7, min_periods=1).mean()
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(dates, values, color="tab:green")
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
ax.xaxis.set_minor_locator(mdates.WeekdayLocator(byweekday=mdates.MO, interval=2))
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")
ax.set_ylabel("7-day avg")
ax.grid(True, which="both", axis="x", linestyle=":", alpha=0.4)
plt.tight_layout()
plt.show()Tipps:
- Minor Locators (z. B. wöchentlich) geben Kontext ohne Beschriftungsflut.
- Datumslabels 30–45° drehen und
ha="right"setzen, um Überlappung zu vermeiden. - Für gemischte Zeitspannen:
AutoDateLocator+ConciseDateFormatter.
Doppelte Achsen: Ticks synchron halten
Bei twinx/secondary_yaxis Locators und Formatter pro Achse setzen, damit Farben, Ticks und Einheiten konsistent bleiben. Legenden wie im Secondary-Axis-Guide ausrichten.
Schnelle Fehlerliste
- Sprunghafte Ticks? Einen deterministischen Locator setzen (z. B.
MultipleLocator). - Labels abgeschnitten?
constrained_layout=Trueoderplt.tight_layout(). - Zu viele Ticks?
MaxNLocator(nbins=5)verwenden oder Minor-Ticks ausblenden (ax.tick_params(which="minor", length=0)).