Desde que actualicé matplotlib, recibo 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 señala el error bastante inútil para diagnosticar la fuente del error.
funtor_aplicativo
Debes 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 desempaqueta 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 desea.
http://matplotlib.sourceforge.net/users/legend_guide.html#adjusting-the-order-of-legend-items
line, = plot(x,sin(x)) ¿Qué significa coma?
Ytsen de Bóer
Use la palabra clave “etiqueta”, así:
plt.plot(x, y, label="x vs. y")
y luego agregue la leyenda así:
plt.legend()
La leyenda conservará las propiedades de la línea como grosor, colores, etc.
paulojr
Usar handles
alias 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()
use la etiqueta mientras traza el gráfico, entonces solo puede usar la leyenda. El nombre del eje x y el nombre del eje y es diferente al nombre de la leyenda.