2012-08-16 8 views
53

Odkąd modernizacji matplotlib pojawia się następujący błąd, gdy próbuje stworzyć legendę:matplotlib Legends nie działa

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

ten występuje nawet z błahego skryptu jak ten:

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

mam znalazłem link, który wskazuje mi na błąd, całkiem bezużyteczny w diagnozowaniu źródła błędu.

Odpowiedz

107

Należy dodać przecinkami:

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

Powodem potrzebujesz przecinki dlatego plt.plot() zwraca krotki obiektów liniowych, bez względu na to, ile faktycznie utworzony z polecenia. Bez przecinka, "plot1" i "plot2" są krotkami zamiast obiektów liniowych, powodując, że późniejsze wywołanie funkcji plt.legend() kończy się niepowodzeniem.

Przecinek domyślnie rozpakowuje wyniki, więc zamiast krotki "działka1" i "działka2" automatycznie stają się pierwszymi obiektami w krotce, tzn. Obiektami liniowymi, których faktycznie potrzebujesz.

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

To działało, całkiem tajemne rzeczy! –

+2

możesz skopiować/dodać wyjaśnienie tutaj? stackoverflow zachęca do kopiowania odpowiednich części na miejscu (podświetlanie, archiwizowanie) – n611x007

5

Zastosowanie 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

Użyj "label" słowo kluczowe, tak jak poniżej:

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

a następnie dodać legendę tak:

pyplot.legend() 

Legenda zachowa właściwości linii, takich jak grubość, kolory, itp

enter image description here

Powiązane problemy