Ticks et formatters dans Matplotlib : des échelles lisibles
Mis à jour le
Des ticks serrés, des dates qui se chevauchent et des nombres non arrondis brouillent la lecture. Quand les ticks tombent au hasard, le contexte disparaît. La réponse : choisir les bons locators (où placer les ticks) et formatters (comment les afficher) pour que chaque axe reste clair.
Locator vs formatter en résumé
| Tâche | Outil | Exemple |
|---|---|---|
| Espacement fixe | MultipleLocator | Tous les 5 en x |
| Nombre max de ticks | MaxNLocator | ≤ 6 ticks en y |
| Dates | AutoDateLocator | Mois/années automatiques |
| Labels personnalisés | FuncFormatter | Ajouter unités/suffixe |
| Rotation des labels | tick_params(rotation=...) | 45° pour dates denses |
Axes numériques : espacer et formater
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 tous les 10 en x, tous les 1.5 en y
ax.xaxis.set_major_locator(MultipleLocator(10))
ax.yaxis.set_major_locator(MultipleLocator(1.5))
# Label avec unité
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()Conseils :
MaxNLocator(nbins=6)garde l’axe propre même si l’étendue change.- Le formatter ne déplace pas les ticks, il change seulement le texte.
- Place l’unité soit dans le label, soit dans le formatter, pas les deux.
Dates : éviter le chevauchement
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("Moyenne 7 jours")
ax.grid(True, which="both", axis="x", linestyle=":", alpha=0.4)
plt.tight_layout()
plt.show()Conseils :
- Les minor locators (par ex. hebdo) donnent du contexte sans surcharger.
- Fais pivoter les dates de 30–45° avec
ha="right"pour éviter le chevauchement. - Pour des plages variées,
AutoDateLocator+ConciseDateFormatters’adaptent automatiquement.
Axes doubles : garder l’alignement
Avec twinx/secondary_yaxis, applique locators et formatters sur chaque axe pour conserver couleurs, ticks et unités cohérents. Aligne la légende comme dans le guide sur l’axe secondaire.
Dépannage express
- Ticks irréguliers ? Choisis un locator déterministe (
MultipleLocator). - Labels coupés ?
constrained_layout=Trueouplt.tight_layout(). - Trop de ticks ? Passe à
MaxNLocator(nbins=5)ou masque les minor (ax.tick_params(which="minor", length=0)).