2012-08-16 12 views
53

Da quando l'aggiornamento matplotlib ottengo il seguente errore ogni volta cercando di creare una leggenda:matplotlib Legends non funziona

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

Questo 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 ho trovato il link che l'errore mi indica piuttosto inutile nel diagnosticare la fonte dell'errore.

risposta

107

Si dovrebbe aggiungere virgole:

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

Il motivo è necessario il virgole è perché plt.plot() restituisce una tupla di oggetti linea, non importa quante siano effettivamente creato dal comando. Senza la virgola, "plot1" e "plot2" sono tuple invece di oggetti linea, rendendo fallita la chiamata successiva a plt.legend().

La virgola scompone 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 di linea che effettivamente si desidera.

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

line, = plot(x,sin(x)) what does comma stand for?

+7

che ha funzionato, roba abbastanza arcano! –

+2

potresti copiare/aggiungere la spiegazione qui? Stackoverflow consiglia di copiare parti rilevanti sul posto (evidenziazione, archiviazione) – n611x007

5

Usa handles AKA Proxy artists

import matplotlib.lines as mlines 
import matplotlib.pyplot as plt 

blue_line = mlines.Line2D([], [], color='blue', label='My Label') 
reds_line = mlines.Line2D([], [], color='reds', label='My Othes') 

plt.legend(handles=[blue_line, reds_line]) 

plt.show() 
0

Utilizzare la parola chiave "etichetta", in questo modo:

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

e quindi aggiungere la leggenda in questo modo:

pyplot.legend() 

La leggenda manterrà proprietà della linea come spessore, colori, ecc

enter image description here

Problemi correlati