web-dev-qa-db-fra.com

Matplotlib Legends ne fonctionne pas

Depuis la mise à jour de matplotlib, l'erreur suivante apparaît 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 ceci:

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 que l'erreur me dirige vers assez inutile pour diagnostiquer la source de l'erreur.

69
Mike Vella

Vous devriez 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 linéaires, quel que soit le nombre réellement créé à partir de la commande. Sans la virgule, "plot1" et "plot2" sont des nuplets au lieu d'objets linéaires, ce qui fait que l'appel ultérieur à plt.legend () échoue. 

La virgule décompresse implicitement les résultats afin qu'au lieu d'un tuple, "plot1" et "plot2" deviennent automatiquement les premiers objets du tuple, c'est-à-dire les objets linéaires 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 virgule?

131
applicative_functor

Utilisez handles AKA Proxy artists

import matplotlib.lines as mlines
import matplotlib.pyplot as plt

blue_line = mlines.Line2D([], [], color='blue', label='My Label')
reds_line = mlines.Line2D([], [], color='reds', label='My Othes')

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

plt.show()
6
ppaulojr

Utilisez le mot clé "label", comme suit:

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 des lignes telles que l'épaisseur, les couleurs, etc.

 enter image description here

3
Ytsen de Boer

utiliser label en traçant un graphique, seul u peut utiliser legend . Le nom de l'axe x et le nom de l'axe y sont différents du nom de la légende.

0
Java By Kiran