Matplotlib Legends no funciona

96

Desde que actualicé matplotlib, aparece el siguiente error cada vez que intento crear una leyenda:

/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),))

Esto incluso ocurre con un script trivial como este:

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

Encontré el enlace al que me apunta el error bastante inútil para diagnosticar la fuente del error.

Mike Vella
fuente

Respuestas:

164

Deberías agregar comas:

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

La razón por la que necesita las comas es porque plt.plot () devuelve una tupla de objetos de línea, sin importar cuántos se creen realmente a partir del comando. Sin la coma, "plot1" y "plot2" son tuplas en lugar de objetos de línea, lo que hace que la llamada posterior a plt.legend () falle.

La coma descomprime implícitamente los resultados para que, en lugar de una tupla, "plot1" y "plot2" se conviertan automáticamente en los primeros objetos dentro de la tupla, es decir, los objetos de línea que realmente deseas.

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

line, = plot (x, sin (x)) ¿Qué significa la coma?

aplicativo_functor
fuente
2
¿Podría copiar / agregar la explicación aquí? stackoverflow fomenta la copia de partes relevantes en el sitio (resaltado, archivo)
n611x007
16

Utilice la palabra clave "etiqueta", así:

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

y luego agregue la leyenda así:

pyplot.legend()

La leyenda conservará las propiedades de la línea como grosor, colores, etc.

ingrese la descripción de la imagen aquí

Ytsen de Boer
fuente
9

Usar 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
fuente
-1

use la etiqueta mientras traza el gráfico, entonces solo u puede usar la leyenda. El nombre del eje xy el nombre del eje y es diferente al nombre de la leyenda.

Java de Kiran
fuente