Ticks et formatters dans Matplotlib : des échelles lisibles
Updated on
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)).