Skip to content

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âcheOutilPourquoi
Marquer un point avec flècheannotateTexte + flèche en un appel
Ajouter du texte libre en coords d’axestextTitres, notes de panneau
Étiqueter des barres automatiquementbar_labelAncre le label au bar
Garder le texte dans le cadreclip_on=True, offsetsÉvite que le texte dépasse l’axe
Enrouler/formatter du textetextwrap.fill, f-stringsMaintient 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 :

  • padding rè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=True si le texte doit rester dans l’axe.
  • Aligne via ha/va et ajoute de courtes coupures de ligne pour éviter les collisions de bord.

Dépannage rapide

  • Labels qui se chevauchent ? Réduis la police, ajuste padding ou fais pivoter légèrement.
  • Flèche cachée ? Monte le zorder ou dessine l’annotation après les zones remplies.
  • Texte qui déborde ? constrained_layout=True ou coupe avec textwrap.fill.