Skip to content

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âcheOutilExemple
Espacement fixeMultipleLocatorTous les 5 en x
Nombre max de ticksMaxNLocator≤ 6 ticks en y
DatesAutoDateLocatorMois/années automatiques
Labels personnalisésFuncFormatterAjouter unités/suffixe
Rotation des labelstick_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 + ConciseDateFormatter s’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=True ou plt.tight_layout().
  • Trop de ticks ? Passe à MaxNLocator(nbins=5) ou masque les minor (ax.tick_params(which="minor", length=0)).