Matplotlib Legend : Guide complet pour ajouter et personnaliser les légendes
Updated on
Un graphique sans légende oblige les lecteurs à deviner quelle ligne est laquelle. Ils associent mentalement les couleurs, lisent mal les données et tirent de mauvaises conclusions. Ajouter une légende avec plt.legend() est simple -- mais contrôler où elle apparaît, son apparence et empêcher qu'elle ne couvre vos données demande plus de travail que la plupart des tutoriels ne le montrent.
Ce guide couvre tout, de la création basique de légendes à la personnalisation avancée : placement à l'intérieur et à l'extérieur du graphique, mises en page multi-colonnes, handles personnalisés et légendes pour des figures complexes.
Légende de base
Labels automatiques
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.show()Le paramètre label dans plot() définit ce qui apparaît dans la légende. Appelez plt.legend() pour l'afficher.
Style orienté objet
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.legend()
plt.show()Placement de la légende
Utilisation du paramètre loc
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
# Positions courantes
ax.legend(loc='upper right') # Par défaut
# ax.legend(loc='upper left')
# ax.legend(loc='lower right')
# ax.legend(loc='lower left')
# ax.legend(loc='center')
# ax.legend(loc='best') # Choisit automatiquement l'emplacement avec le moins de chevauchement
plt.show()Toutes les options loc
| Chaîne loc | Numéro loc |
|---|---|
'best' | 0 |
'upper right' | 1 |
'upper left' | 2 |
'lower left' | 3 |
'lower right' | 4 |
'right' | 5 |
'center left' | 6 |
'center right' | 7 |
'lower center' | 8 |
'upper center' | 9 |
'center' | 10 |
Positionnement précis avec bbox_to_anchor
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.plot(x, np.sin(x) + np.cos(x), label='sin(x) + cos(x)')
# Positionner la légende à des coordonnées spécifiques (x, y) en fraction d'axes
ax.legend(loc='upper left', bbox_to_anchor=(0.02, 0.98))
plt.show()Légende en dehors du graphique
Quand la légende chevauche les données, déplacez-la à l'extérieur :
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(10, 5))
for i in range(6):
ax.plot(x, np.sin(x + i * 0.5), label=f'Phase {i}')
# Placer la légende à droite du graphique
ax.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))
plt.tight_layout()
plt.show()import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 6))
for i in range(5):
ax.plot(x, np.sin(x + i), label=f'Series {i+1}')
# Placer la légende sous le graphique
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=5)
plt.tight_layout()
plt.show()Style de la légende
Taille de police et cadre
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.legend(
fontsize=12,
frameon=True, # Afficher le cadre (par défaut True)
framealpha=0.8, # Transparence du cadre
facecolor='lightyellow', # Couleur de fond
edgecolor='gray', # Couleur du cadre
shadow=True, # Ombre portée
)
plt.show()Mise en page multi-colonnes
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(10, 5))
for i in range(8):
ax.plot(x, np.sin(x + i * 0.4), label=f'Signal {i+1}')
# 4 colonnes pour une légende compacte
ax.legend(ncol=4, loc='upper center', fontsize=9)
plt.show()Titre de la légende
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, x**2, label='Quadratic')
ax.plot(x, x**1.5, label='Power 1.5')
ax.plot(x, x, label='Linear')
ax.legend(title='Modèles de croissance', title_fontsize=13, fontsize=11)
plt.show()Handles de légende personnalisés
Entrées de légende manuelles
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.lines as mlines
import numpy as np
fig, ax = plt.subplots(figsize=(8, 5))
# Tracer sans labels
ax.scatter(np.random.randn(50), np.random.randn(50), c='blue', s=20)
ax.scatter(np.random.randn(50) + 2, np.random.randn(50), c='red', s=20)
# Créer des handles personnalisés
blue_patch = mpatches.Patch(color='blue', label='Groupe A')
red_patch = mpatches.Patch(color='red', label='Groupe B')
line_handle = mlines.Line2D([], [], color='green', linestyle='--', label='Seuil')
ax.legend(handles=[blue_patch, red_patch, line_handle])
plt.show()Légende pour nuage de points avec mappage de couleurs
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(8, 5))
categories = ['A', 'B', 'C']
colors = ['#e74c3c', '#3498db', '#2ecc71']
for cat, color in zip(categories, colors):
x = np.random.randn(30)
y = np.random.randn(30)
ax.scatter(x, y, c=color, label=f'Catégorie {cat}', alpha=0.7, s=50)
ax.legend()
plt.show()Options de personnalisation de la légende
| Paramètre | Description | Exemple |
|---|---|---|
loc | Chaîne ou numéro de position | 'upper right', 2 |
bbox_to_anchor | Point d'ancrage (x, y) | (1.0, 0.5) |
ncol | Nombre de colonnes | 3 |
fontsize | Taille du texte | 12, 'small' |
title | Titre de la légende | 'My Legend' |
frameon | Afficher le cadre | True, False |
framealpha | Transparence du cadre | 0.8 |
facecolor | Couleur de fond | 'white' |
edgecolor | Couleur du cadre | 'gray' |
shadow | Ombre portée | True |
markerscale | Multiplicateur de taille de marqueur | 1.5 |
labelspacing | Espace vertical entre les entrées | 0.5 |
handlelength | Longueur de la ligne de légende | 2.0 |
Exemples pratiques
Légende pour types de graphiques multiples
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(5)
values = [23, 45, 56, 78, 32]
trend = [20, 35, 50, 65, 40]
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(x, values, alpha=0.7, label='Réel', color='steelblue')
ax.plot(x, trend, 'ro-', label='Tendance', linewidth=2)
ax.axhline(y=50, color='green', linestyle='--', label='Objectif')
ax.legend(loc='upper left')
ax.set_xlabel('Trimestre')
ax.set_ylabel('Revenus ($K)')
plt.show()Légendes séparées pour axes doubles
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2020, 2027)
revenue = [100, 120, 115, 140, 160, 175, 200]
employees = [50, 55, 52, 60, 70, 75, 85]
fig, ax1 = plt.subplots(figsize=(8, 5))
line1 = ax1.plot(x, revenue, 'b-o', label='Revenus ($M)')
ax1.set_ylabel('Revenus ($M)', color='blue')
ax2 = ax1.twinx()
line2 = ax2.plot(x, employees, 'r-s', label='Employés')
ax2.set_ylabel('Employés', color='red')
# Combiner les légendes
lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper left')
plt.show()Exploration interactive des données
Lors de l'itération sur l'esthétique du graphique et le placement de la légende, PyGWalker (opens in a new tab) vous permet de construire des visualisations interactives dans Jupyter en glissant des colonnes -- les légendes, couleurs et tailles sont générées automatiquement :
import pandas as pd
import pygwalker as pyg
df = pd.read_csv('your_data.csv')
walker = pyg.walk(df)FAQ
Comment ajouter une légende à un graphique Matplotlib ?
Ajoutez label='name' à chaque appel plot(), scatter() ou bar(), puis appelez plt.legend() ou ax.legend(). La légende utilise automatiquement les labels que vous avez fournis.
Comment déplacer la légende en dehors du graphique ?
Utilisez bbox_to_anchor avec loc. Pour le côté droit : ax.legend(loc='center left', bbox_to_anchor=(1.0, 0.5)). Pour en dessous : ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1)). Appelez plt.tight_layout() pour éviter le rognage.
Comment changer la taille de police de la légende dans Matplotlib ?
Passez fontsize à legend() : ax.legend(fontsize=14) ou utilisez des tailles en chaîne comme 'small', 'medium', 'large'. Pour le titre : ax.legend(title='Title', title_fontsize=16).
Comment créer une légende avec plusieurs colonnes ?
Utilisez le paramètre ncol : ax.legend(ncol=3) crée une mise en page à 3 colonnes. C'est utile quand vous avez beaucoup d'entrées de légende et que vous voulez une mise en page horizontale compacte.
Comment supprimer le cadre de la légende ?
Définissez frameon=False : ax.legend(frameon=False). Pour garder le cadre mais le rendre transparent, utilisez framealpha=0 : ax.legend(framealpha=0).
Conclusion
Les légendes Matplotlib commencent avec les paramètres label et plt.legend(). Utilisez loc pour les positions standard, bbox_to_anchor pour déplacer la légende en dehors du graphique, ncol pour les mises en page multi-colonnes, et les paramètres de style comme fontsize, frameon et shadow pour la personnalisation. Pour les graphiques avec de nombreuses séries, placez la légende en dehors de la zone des axes et appelez tight_layout() pour éviter le rognage. Pour les figures complexes avec des axes doubles, combinez manuellement les handles de ligne pour créer une légende unifiée.