71 votes

Ma légende matplotlib.pyplot est coupée.

J'essaie de créer un graphique avec une légende sur le côté en utilisant matplotlib. Je peux voir que le tracé est créé, mais les limites de l'image ne permettent pas d'afficher toute la légende.

lines = []
ax = plt.subplot(111)
for filename in args:
    lines.append(plt.plot(y_axis, x_axis, colors[colorcycle], linestyle='steps-pre', label=filename))
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

Cela produit : enter image description here

133voto

strpeter Points 1762

Bien qu'il soit tard, je souhaite faire référence à une alternative intéressante récemment introduite :

Nouvelle fonctionnalité de matplotlib : La boîte de délimitation étroite

Si vous êtes intéressé par le fichier de sortie de plt.savefig Dans ce cas, le drapeau bbox_inches='tight' est votre ami !

import matplotlib.pyplot as plt

fig = plt.figure(1)
plt.plot([1, 2, 3], [1, 0, 1], label='A')
plt.plot([1, 2, 3], [1, 2, 2], label='B')
plt.legend(loc='center left', bbox_to_anchor=(1, 0))

fig.savefig('samplefigure', bbox_inches='tight')

Output file: samplefigure.png

Je souhaite également me référer à une réponse plus détaillée : Déplacer la légende de matplotlib en dehors de l'axe la coupe de la boîte de la figure.

Avantages

  • Il n'est pas nécessaire d'ajuster les données/image réelles.
  • Il est compatible avec plt.subplots aussi bien que les autres ne le sont pas !
  • Il s'applique au moins aux fichiers de sortie les plus utilisés, par exemple png, pdf.

31voto

gcalmettes Points 2391

Comme l'a souligné Adam, vous devez laisser de l'espace sur le côté de votre graphique. Si vous voulez affiner l'espace nécessaire, vous pouvez regarder la fonction ajouter_axes méthode de matplotlib.pyplot.artist.

Vous trouverez ci-dessous un exemple rapide :

import matplotlib.pyplot as plt
import numpy as np

# some data
x = np.arange(0, 10, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

# plot of the data
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.6, 0.75])
ax.plot(x, y1,'-k', lw=2, label='black sin(x)')
ax.plot(x, y2,'-r', lw=2, label='red cos(x)')
ax.set_xlabel('x', size=22)
ax.set_ylabel('y', size=22)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

plt.show()

et l'image résultante : image

10voto

M.Reza Points 172

Il suffit d'utiliser plt.tight_layout()

import matplotlib.pyplot as plt

fig = plt.figure(1)
plt.plot([1, 2, 3], [1, 0, 1], label='A')
plt.plot([1, 2, 3], [1, 2, 2], label='B')
plt.legend(loc='center left', bbox_to_anchor=(1, 0))

plt.tight_layout()

Ceci est probablement introduit dans les nouvelles matplotlib et fait proprement son travail.

7voto

ecoe Points 382

Voici une autre façon de faire de l'espace (rétrécir un axe) :

# get the current axis
ax = plt.gca()
# Shink current axis by 20%
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])

où 0,8 met à l'échelle la largeur de l'axe de 20%. Sur ma machine win7 64, l'utilisation d'un facteur supérieur à 1 permet de faire de la place pour la légende si elle est en dehors du tracé.

Ce code a été référencé à partir de : Comment mettre la légende hors de l'intrigue

3voto

bernie Points 44206

Modifier : @gcalmettes a publié une meilleure réponse .
Sa solution devrait probablement être utilisée à la place de la méthode présentée ci-dessous.
Néanmoins, je vais laisser ceci car il est parfois utile de voir différentes façons de faire les choses.


Comme indiqué dans le guide de traçage des légendes vous pouvez faire de la place pour une autre intrigue secondaire et y placer la légende.

import matplotlib.pyplot as plt
ax = plt.subplot(121) # <- with 2 we tell mpl to make room for an extra subplot
ax.plot([1,2,3], color='red', label='thin red line')
ax.plot([1.5,2.5,3.5], color='blue', label='thin blue line')
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.show()

Produit :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X