Matplotlib Leyendas no funciona

2 minutos de lectura

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.

avatar de usuario
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?

avatar de usuario
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.

ingrese la descripción de la imagen aquí

avatar de usuario
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.

¿Ha sido útil esta solución?