Skip to content

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

AufgabeWerkzeugBeispiel
Tick-Abstand per Schritt setzenMultipleLocatorAlle 5 Einheiten auf x
Maximalanzahl begrenzenMaxNLocatorHöchstens 6 Ticks auf y
DatumsticksAutoDateLocatorAutomatisch Monate/Jahre
Eigene BeschriftungFuncFormatterEinheiten anhängen, Suffix
Labels drehentick_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=True oder plt.tight_layout().
  • Zu viele Ticks? MaxNLocator(nbins=5) verwenden oder Minor-Ticks ausblenden (ax.tick_params(which="minor", length=0)).