Skip to content

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â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)).