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.

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?


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


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()

-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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.