Skip to content

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 locNumé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ètreDescriptionExemple
locChaîne ou numéro de position'upper right', 2
bbox_to_anchorPoint d'ancrage (x, y)(1.0, 0.5)
ncolNombre de colonnes3
fontsizeTaille du texte12, 'small'
titleTitre de la légende'My Legend'
frameonAfficher le cadreTrue, False
framealphaTransparence du cadre0.8
facecolorCouleur de fond'white'
edgecolorCouleur du cadre'gray'
shadowOmbre portéeTrue
markerscaleMultiplicateur de taille de marqueur1.5
labelspacingEspace vertical entre les entrées0.5
handlelengthLongueur de la ligne de légende2.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.

📚