Positionner la légende en dehors du tracé dans Matplotlib
Published on
La gestion du positionnement des légendes dans les visualisations de données peut souvent être un défi. Aujourd'hui, nous allons aborder ce problème de front, en démontrant comment placer efficacement une légende en dehors d'un tracé à l'aide de la populaire bibliothèque de visualisation de données, Matplotlib. Plongeons dans le sujet et assurez-vous que vos légendes n'interfèrent plus jamais avec vos données !
Comprendre le problème
La légende d'un tracé, bien qu'étant un élément essentiel pour l'interprétation des données, peut parfois prendre de la place précieuse dans le tracé, entraînant des tracés encombrés et moins lisibles. Une solution courante à ce problème consiste à déplacer la légende en dehors de la zone de tracé.
La solution Matplotlib
Matplotlib, une bibliothèque Python robuste et polyvalente pour la visualisation de données, propose une solution simple pour positionner la légende en dehors du tracé.
Pour illustrer le concept, nous créerons d'abord un simple tracé de ligne en utilisant l'API pyplot
de Matplotlib :
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()
Dans le code ci-dessus, nous avons deux tracés de ligne représentant sin(x)
et cos(x)
. L'appel de la fonction legend()
ajoute une légende au tracé à l'intérieur de la zone de tracé, obscurcissant souvent certaines parties des données.
Positionner la légende en dehors du tracé
Pour déplacer la légende en dehors du tracé, nous pouvons utiliser le paramètre bbox_to_anchor
de la fonction legend()
. Ce paramètre nous permet de spécifier la position de la boîte englobante de la légende par rapport aux axes du tracé.
Voici un exemple où nous plaçons la légende à droite du tracé :
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()
Dans ce code, bbox_to_anchor=(1.05, 1)
positionne la boîte englobante de la légende juste à l'extérieur des axes, dans le coin supérieur gauche. loc='upper left'
spécifie le point de la boîte de légende qui doit être placé aux coordonnées données dans bbox_to_anchor
.
Ajuster la légende
Outre le positionnement de base, nous pouvons apporter plusieurs ajustements à la légende pour mieux répondre à nos besoins.
Réduire la taille de la police
Pour réduire la taille de la police du texte de la légende :
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', prop={'size': 6})
plt.show()
Dans ce code, prop={'size': 6}
réduit la taille de la police du texte de la légende, ce qui rend la boîte de légende globale plus petite.
Changer l'orientation de la légende
Si vous souhaitez une légende horizontale, utilisez le paramètre ncol
pour spécifier le nombre de colonnes :
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(0.5, -0.15), loc='upper center', ncol=2)
plt.show()
Prendre le contrôle du positionnement de votre légende Matplotlib
Une des tâches récurrentes en visualisation de données avec Python consiste à créer des tracés clairs, concis et attrayants. Une partie cruciale de cet objectif consiste à bien positionner la légende en dehors du tracé dans Matplotlib. Ce guide complet vous guidera à travers différentes méthodes pour y parvenir.
Bbox_to_anchor : Votre billet pour un meilleur positionnement de la légende
Il existe de nombreuses approches pour positionner votre légende en dehors de la boîte de tracé de Matplotlib. L'une des méthodes les plus flexibles et efficaces utilise l'argument de mot-clé bbox_to_anchor
. Plongeons plus en détail dans la façon dont vous pouvez utiliser cette fonctionnalité puissante pour améliorer l'esthétique de votre tracé.
Pour une application de base de bbox_to_anchor
, considérez l'exemple suivant où la légende est déplacée légèrement à l'extérieur des limites des axes :
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
ax.plot(x, i * x, label='$y = %ix$' % i)
ax.legend(bbox_to_anchor=(1.1, 1.05))
plt.show()
Dans le code ci-dessus, la légende est placée de manière stratégique légèrement à droite et au-dessus du coin supérieur droit des limites des axes, ce qui permet de ne pas obstruer le tracé tout en restant facilement visible.
Découvrir le pouvoir de Shrink : Une autre clé pour un positionnement optimal de la légende
Dans les scénarios où vous souhaitez déplacer la légende encore plus à l'extérieur du tracé, vous pouvez envisager de réduire les dimensions du tracé actuel. Regardons un exemple de code :
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
ax.plot(x, i * x, label='$y = %ix$'%i)
# Réduire l'axe actuel de 20%
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
# Placer une légende à droite de l'axe actuel
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()
Cette approche nous permet d'allouer une partie de l'espace de tracé pour accueillir confortablement la légende. Remarquez comment nous avons utilisé ax.get_position()
pour obtenir la position actuelle des axes, puis nous l'avons ajustée en conséquence avant de repositionner la légende.
Placer la légende en bas du tracé
Si placer la légende à droite du tracé n'est pas satisfaisant, il est également possible de la positionner en dessous du tracé. Voici un exemple :
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
line, = ax.plot(x, i * x, label='$y = %ix$'%i)
# Réduire la hauteur de l'axe actuel de 10% en bas
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1, box.width, box.height * 0.9])
Placer une légende en dessous de l'axe actuel
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), fancybox=True, shadow=True, ncol=5)
plt.show()
Cette approche permet d'utiliser efficacement l'espace disponible sans obstruer la vue du graphique.
## La légende des légendes : Guide de la légende Matplotlib
En tant que data scientist en herbe ou professionnel expérimenté, savoir comment contrôler l'emplacement de la légende dans vos graphiques Matplotlib est une compétence essentielle. Maintenant que nous avons couvert plusieurs méthodes pour positionner la légende en dehors du graphique, plongeons-nous dans quelques personnalisations avancées.
### Affiner le style de la légende
Parfois, nous voulons rendre notre légende encore plus lisible et esthétiquement plaisante. Les paramètres `fancybox`, `shadow` et `borderpad` permettent une variété d'options de style :
```python
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
fancybox=True, shadow=True, borderpad=1.5, ncol=5)
Dans cet exemple, fancybox=True
donne à la boîte de légende des coins arrondis, shadow=True
ajoute un effet d'ombre, et borderpad=1.5
augmente la marge à l'intérieur de la boîte.
Ordonner les entrées de la légende
Dans certains cas, vous voudrez peut-être changer l'ordre des entrées dans votre légende. La classe HandlerLine2D
de Matplotlib peut vous aider à accomplir cela. Voici une illustration simple :
from matplotlib.lines import Line2D
fig, ax = plt.subplots()
lines = []
labels = []
for i in range(5):
line, = ax.plot(x, i * x, label='$y = %ix$' % i)
lines.append(line)
labels.append('$y = %ix$' % i)
# Réorganiser les étiquettes et les poignées de lignes
lines = [lines[i] for i in [4, 2, 0, 1, 3]]
labels = [labels[i] for i in [4, 2, 0, 1, 3]]
# Créer une légende pour la première ligne
first_legend = plt.legend(lines[:2], labels[:2], loc='upper left')
# Ajouter la légende manuellement aux axes actuels
ax.add_artist(first_legend)
# Créer une autre légende pour le reste.
plt.legend(lines[2:], labels[2:], loc='lower right')
plt.show()
Dans ce scénario, nous traçons d'abord les lignes, stockons leurs poignées et étiquettes, puis les réorganisons selon nos préférences.
Alternative à Matplotlib : Visualiser les données avec PyGWalker
En plus d'utiliser Matplotlib pour visualiser votre dataframe pandas, voici une alternative, une bibliothèque python Open Source qui peut vous aider à créer des visualisations de données facilement : PyGWalker (opens in a new tab).
Plus besoin d'effectuer un traitement compliqué avec du code Python, il suffit d'importer vos données et de faire glisser-déposer les variables pour créer toutes sortes de visualisations de données ! Voici une vidéo de démonstration rapide sur l'opération :
Voici comment utiliser PyGWalker dans votre notebook Jupyter :
pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)
Vous pouvez également l'essayer dans un notebook Kaggle/Google Colab :
PyGWalker est construit grâce au soutien de notre communauté Open Source. N'oubliez pas de consulter PyGWalker GitHub (opens in a new tab) et de nous donner une étoile !
Conclusion
Comprendre les différentes options de personnalisation de la légende Matplotlib est essentiel pour créer des graphiques de qualité professionnelle. Alors, n'oubliez pas de pratiquer ces techniques et d'explorer la documentation de Matplotlib pour devenir compétent dans cet outil essentiel pour la visualisation des données.
Questions fréquemment posées
Dans ce qui suit, nous aborderons quelques questions fréquemment posées concernant le placement de la légende dans Matplotlib.
Q1: Puis-je placer une légende Matplotlib en dehors de la zone du graphique sans redimensionner le graphique lui-même ?
Oui, vous pouvez placer la légende en dehors du graphique sans redimensionner le graphique. Cependant, la légende peut ne pas être visible dans la figure enregistrée car l'option bbox_inches='tight'
dans plt.savefig()
ne tient peut-être pas compte des éléments situés à l'extérieur des limites des axes.
Q2: Existe-t-il un moyen de déterminer automatiquement le meilleur emplacement pour la légende ?
Oui, Matplotlib permet de déterminer automatiquement le meilleur emplacement pour la légende en passant loc='best'
dans la fonction legend()
. Cette fonctionnalité place la légende à l'emplacement minimisant son chevauchement avec le graphique.
Q3: Comment rendre les étiquettes de légende plus lisibles si elles se chevauchent avec le graphique ?
Vous pouvez augmenter la lisibilité des étiquettes de légende en utilisant un arrière-plan de légende semi-transparent. Cela peut être réalisé en définissant le paramètre framealpha
dans legend()
. Par exemple, ax.legend(framealpha=0.5)
donne à l'arrière-plan de la légende une semi-transparence.