117 votes

Les légendes de Matplotlib ne fonctionnent pas

Depuis la mise à jour de matplotlib, j'obtiens l'erreur suivante lorsque j'essaie de créer une légende :

/usr/lib/pymodules/python2.7/matplotlib/legend.py:610: UserWarning: Legend does not support [<matplotlib.lines.Line2D object at 0x3a30810>]
Use proxy artist instead.

http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist

  warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str(orig_handle),))
/usr/lib/pymodules/python2.7/matplotlib/legend.py:610: UserWarning: Legend does not support [<matplotlib.lines.Line2D object at 0x3a30990>]
Use proxy artist instead.

http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist

  warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str(orig_handle),))

Cela se produit même avec un script trivial comme celui-ci :

import matplotlib.pyplot as plt

a = [1,2,3]
b = [4,5,6]
c = [7,8,9]

plot1 = plt.plot(a,b)
plot2 = plt.plot(a,c)

plt.legend([plot1,plot2],["plot 1", "plot 2"])
plt.show()

J'ai trouvé le lien vers lequel l'erreur me dirige assez inutile pour diagnostiquer la source de l'erreur.

192voto

applicative_functor Points 2331

Vous devez ajouter des virgules :

plot1, = plt.plot(a,b)
plot2, = plt.plot(a,c)

La raison pour laquelle vous avez besoin des virgules est que plt.plot() renvoie un tuple d'objets ligne, quel que soit le nombre d'objets créés par la commande. Sans la virgule, "plot1" et "plot2" sont des tuples au lieu d'objets ligne, ce qui fait échouer l'appel ultérieur à plt.legend().

La virgule décompose implicitement les résultats de sorte qu'au lieu d'un tuple, "plot1" et "plot2" deviennent automatiquement les premiers objets du tuple, c'est-à-dire les objets ligne que vous voulez réellement.

http://matplotlib.sourceforge.net/users/legend_guide.html#adjusting-the-order-of-legend-items

ligne, = plot(x,sin(x)) que signifie la virgule ?

29voto

Ytsen de Boer Points 826

Utilisez le mot-clé "label", comme ceci :

plt.plot(x, y, label='x vs. y')

puis ajoutez la légende comme suit :

plt.legend()

La légende conservera les propriétés des lignes telles que l'épaisseur, les couleurs, etc.

enter image description here

11voto

ppaulojr Points 1180

Utilice handles AKA Proxy artists

import matplotlib.lines as mlines
import matplotlib.pyplot as plt
# defining legend style and data
blue_line = mlines.Line2D([], [], color='blue', label='My Label')
reds_line = mlines.Line2D([], [], color='red', label='My Othes')

plt.legend(handles=[blue_line, reds_line])

plt.show()

-1voto

Java By Kiran Points 97

Utilisez l'étiquette pendant le tracé du graphique, puis seulement vous pouvez utiliser la légende. Le nom de l'axe x et de l'axe y est différent du nom de la légende.

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