Matplotlib Legends ne fonctionne pas

96

Depuis la mise à niveau de matplotlib, j'obtiens l'erreur suivante chaque fois que j'essaye 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 m'indique assez inutile pour diagnostiquer la source de l'erreur.

Mike Vella
la source

Réponses:

164

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 réellement créé à partir de la commande. Sans la virgule, "plot1" et "plot2" sont des tuples au lieu d'objets de ligne, ce qui fait échouer l'appel ultérieur à plt.legend ().

La virgule décompresse implicitement les résultats de sorte qu'au lieu d'un tuple, "plot1" et "plot2" deviennent automatiquement les premiers objets dans le 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

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

applicative_functor
la source
2
pourriez-vous copier / ajouter l'explication ici? stackoverflow encourage la copie des parties pertinentes sur site (mise en évidence, archivage)
n611x007
16

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

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

puis ajoutez la légende comme ceci:

pyplot.legend()

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

entrez la description de l'image ici

Ytsen de Boer
la source
9

Utilisez handlesAKAProxy 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()
ppaulojr
la source
-1

utilisez l'étiquette lors du traçage du graphique, alors seulement vous pouvez utiliser la légende. Le nom de l'axe x et le nom de l'axe y sont différents du nom de la légende.

Java par Kiran
la source