Annotations et texte dans Matplotlib : mettre en avant les insights
Updated on
Des pics non signalés ou des barres sans label obligent le lecteur à deviner. Si le texte se chevauche ou s’éloigne des données, le message se perd. Des annotations claires règlent cela : labels courts, flèches bien placées et polices cohérentes qui guident l’attention sans ajouter de bruit.
Choisir le bon outil texte
| Tâche | Outil | Pourquoi |
|---|---|---|
| Marquer un point avec flèche | annotate | Texte + flèche en un appel |
| Ajouter du texte libre en coords d’axes | text | Titres, notes de panneau |
| Étiqueter des barres automatiquement | bar_label | Ancre le label au bar |
| Garder le texte dans le cadre | clip_on=True, offsets | Évite que le texte dépasse l’axe |
| Enrouler/formatter du texte | textwrap.fill, f-strings | Maintient des labels courts et lisibles |
Annoter un pic avec une flèche
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 300)
y = np.sin(x) * np.exp(-x / 5)
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, y, color="tab:blue")
peak_idx = np.argmax(y)
peak_x, peak_y = x[peak_idx], y[peak_idx]
ax.annotate(
"Pic du signal",
xy=(peak_x, peak_y),
xytext=(peak_x + 1.2, peak_y + 0.2),
arrowprops=dict(arrowstyle="->", color="tab:red", lw=1.5),
bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="tab:red", alpha=0.9),
fontsize=10,
color="tab:red",
)
ax.set_xlabel("Temps (s)")
ax.set_ylabel("Amplitude")
ax.grid(True, linestyle="--", alpha=0.3)
plt.tight_layout()
plt.show()Conseils :
- Décale légèrement (
xytext) pour garder une flèche courte et lisible. - Un fond clair (
bbox) apporte du contraste sur les tracés chargés. - Reste sur 2–4 mots pour ne pas masquer les données.
Étiqueter des barres sans chevauchement
import matplotlib.pyplot as plt
items = ["A", "B", "C", "D"]
values = [28, 35, 30, 22]
fig, ax = plt.subplots(figsize=(6, 4))
bars = ax.bar(items, values, color="tab:purple", alpha=0.9)
ax.bar_label(bars, labels=[f"{v}k" for v in values], padding=3)
ax.set_ylabel("Unités vendues")
ax.set_ylim(0, 40)
plt.tight_layout()
plt.show()Conseils :
paddingrègle la distance au sommet; négatif pour placer le texte dans le bar.- Pour des barres empilées,
label_type="center"place le texte au centre de chaque pile. - Valeurs petites ? Texte blanc et label à l’intérieur pour le contraste.
Notes inline et placement sûr
ax.text(
0.02, 0.95, "Expérience 3\nn=120",
transform=ax.transAxes,
ha="left", va="top",
fontsize=9,
bbox=dict(boxstyle="round", fc="white", ec="0.7", alpha=0.8)
)Repères :
- Avec
transform=ax.transAxes, les positions (0–1) restent fixes même si le graphique est redimensionné. - Utilise
clip_on=Truesi le texte doit rester dans l’axe. - Aligne via
ha/vaet ajoute de courtes coupures de ligne pour éviter les collisions de bord.
Dépannage rapide
- Labels qui se chevauchent ? Réduis la police, ajuste
paddingou fais pivoter légèrement. - Flèche cachée ? Monte le
zorderou dessine l’annotation après les zones remplies. - Texte qui déborde ?
constrained_layout=Trueou coupe avectextwrap.fill.