Matplotlib Legends não funciona


94

Desde a atualização do matplotlib, recebo o seguinte erro sempre que tento criar uma legenda:

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

Isso ocorre até mesmo com um 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()

Eu achei o link para o qual o erro me aponta bastante inútil para diagnosticar a origem do erro.

Respostas:


164

Você deve adicionar vírgulas:

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

A razão pela qual você precisa das vírgulas é porque plt.plot () retorna uma tupla de objetos de linha, não importa quantos são realmente criados a partir do comando. Sem a vírgula, "plot1" e "plot2" são tuplas em vez de objetos de linha, fazendo com que a chamada posterior a plt.legend () falhe.

A vírgula descompacta implicitamente os resultados para que, em vez de uma tupla, "plot1" e "plot2" se tornem automaticamente os primeiros objetos dentro da tupla, ou seja, os objetos de linha que você realmente deseja.

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

linha, = plot (x, sin (x)) o que significa vírgula?


2
você poderia copiar / adicionar a explicação aqui? stackoverflow incentiva a cópia de peças relevantes no local (destaque, arquivamento)
n611x007

16

Use a palavra-chave "rótulo", assim:

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

e adicione a legenda assim:

pyplot.legend()

A legenda manterá as propriedades da linha, como espessura, cores, etc.

insira a descrição da imagem aqui


9

Use 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

use o rótulo durante a plotagem do gráfico, então apenas você pode usar a legenda. O nome do eixo xeo nome do eixo y são diferentes do nome da legenda.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.