Matplotlib Legends non funziona


94

Da quando ho aggiornato matplotlib ricevo il seguente errore ogni volta che provo a creare una 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),))

Ciò si verifica anche con uno script banale come questo:

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

Ho trovato il collegamento a cui l'errore mi indirizza abbastanza inutile nella diagnosi della fonte dell'errore.

Risposte:


164

Dovresti aggiungere virgole:

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

Il motivo per cui hai bisogno delle virgole è perché plt.plot () restituisce una tupla di oggetti linea, non importa quanti siano effettivamente creati dal comando. Senza la virgola, "plot1" e "plot2" sono tuple invece di oggetti riga, rendendo la successiva chiamata a plt.legend () fallita.

La virgola scompatta implicitamente i risultati in modo che, invece di una tupla, "plot1" e "plot2" diventino automaticamente i primi oggetti all'interno della tupla, ovvero gli oggetti linea che si desidera effettivamente.

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

riga, = trama (x, sin (x)) cosa significa virgola?


2
potresti copiare / aggiungere la spiegazione qui? stackoverflow incoraggia la copia di parti rilevanti in loco (evidenziazione, archiviazione)
n611x007

16

Utilizza la parola chiave "etichetta" in questo modo:

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

e quindi aggiungi la legenda in questo modo:

pyplot.legend()

La legenda manterrà le proprietà della linea come spessore, colori, ecc.

inserisci qui la descrizione dell'immagine


9

Usa 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

usa l'etichetta mentre traccia il grafico, quindi solo tu puoi usare la legenda. Il nome dell'asse x e il nome dell'asse y sono diversi dal nome della legenda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.