HOWTO · Matplotlib
Comment placer une légende en dehors du graphique avec Matplotlib
Apprenez à placer une légende Matplotlib en dehors des axes et à la conserver dans les figures enregistrées.
Sur cette page
Pour placer une légende Matplotlib en dehors des axes, associez bbox_to_anchor à loc. Par exemple, ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) ancre le coin supérieur gauche de la légende juste au-delà du coin supérieur droit des axes. Dans le système de coordonnées par défaut des axes, (0, 0) correspond au coin inférieur gauche et (1, 1) au coin supérieur droit.
Exemple de bbox_to_anchor
Avec deux valeurs pour bbox_to_anchor, vous pouvez placer la légende juste à l’extérieur des axes. Pour Axes.legend, cette paire désigne un point d’ancrage en coordonnées des axes ; loc aligne le coin correspondant de la légende sur ce point. L’exemple complet ci-dessous trace deux courbes légendées et réserve de l’espace dans la figure pour la légende.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
fig.subplots_adjust(right=0.78)
plt.close(fig)
Pour régler la position plus finement, bbox_to_anchor accepte aussi le quadruplet (x0, y0, width, height). Celui-ci définit une boîte d’ancrage, et non les dimensions de la légende : (x0, y0) en indique le coin inférieur gauche, tandis que width et height en définissent la largeur et la hauteur en coordonnées des axes. loc choisit le point de la légende à aligner sur le point correspondant de cette boîte. Ainsi, loc="upper left" aligne le coin supérieur gauche de la légende sur celui de la boîte. Parmi les valeurs de chaîne courantes figurent "upper right", "lower left", "center" et "best". Matplotlib accepte également leurs codes numériques : de 0 pour "best" à 10 pour "center".
tight_layout() ajuste les paramètres des sous-graphiques pour faire de la place aux éléments décoratifs des axes, comme les étiquettes et les titres. Cette fonction ne réserve pas systématiquement de l’espace pour une légende extérieure. Pour que celle-ci reste visible dans une fenêtre, laissez-lui de la place avec fig.subplots_adjust(right=...) ou choisissez une mise en page qui tient compte à la fois des axes et de la légende. La première image montre une légende placée à l’extérieur ; la seconde illustre ce qui peut arriver si la figure ne lui réserve pas d’espace.
bbox_extra_artists et bbox_inches pour éviter que la boîte de légende ne soit recadrée
Lors de l’enregistrement d’une figure, transmettez la légende extérieure dans bbox_extra_artists et définissez bbox_inches="tight". L’opération de sauvegarde prend alors la légende en compte pour calculer la boîte englobante ajustée, afin qu’elle figure dans l’image exportée. L’exemple ci-dessous enregistre un PNG dans un répertoire temporaire.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
legend = ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
with TemporaryDirectory() as directory:
output_path = Path(directory) / "example.png"
fig.savefig(
output_path,
dpi=300,
format="png",
bbox_extra_artists=(legend,),
bbox_inches="tight",
)
plt.close(fig)
bbox_extra_artists reçoit les artistes à inclure dans le calcul de la boîte englobante ajustée par Matplotlib. bbox_inches="tight" demande à savefig d’utiliser cette boîte calculée pour l’image enregistrée. Ces options évitent le recadrage lors de l’export ; elles ne redimensionnent pas la légende et ne changent pas sa position dans les axes.