Matplotlib Legends nie działa

97

Od czasu aktualizacji matplotlib za każdym razem, gdy próbuję utworzyć legendę, pojawia się następujący błąd:

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

Dzieje się tak nawet w przypadku trywialnego skryptu, takiego 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()

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

Mike Vella
źródło

Odpowiedzi:

165

Powinieneś dodać przecinki:

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

Powodem, dla którego potrzebujesz przecinków, jest to, że plt.plot () zwraca krotkę obiektów liniowych, bez względu na to, ile faktycznie zostało utworzonych za pomocą polecenia. Bez przecinka, "plot1" i "plot2" są krotkami zamiast obiektami liniowymi, przez co późniejsze wywołanie plt.legend () kończy się niepowodzeniem.

Przecinek niejawnie rozpakowuje wyniki, tak że zamiast krotki, „plot1” i „plot2” automatycznie stają się pierwszymi obiektami w krotce, tj. Obiektami liniowymi, które faktycznie chcesz.

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

line, = plot (x, sin (x)) co oznacza przecinek?

application_functor
źródło
2
czy możesz skopiować / dodać wyjaśnienie tutaj? stackoverflow zachęca do kopiowania odpowiednich części na miejscu (podświetlanie, archiwizacja)
n611x007
17

Użyj słowa kluczowego „etykieta”, na przykład:

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

a następnie dodaj legendę w ten sposób:

pyplot.legend()

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

wprowadź opis obrazu tutaj

Ytsen de Boer
źródło
9

Użyj 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()
ppaulojr
źródło
-1

użyj etykiety podczas kreślenia wykresu, wtedy tylko ty możesz używać legendy. nazwa osi x i nazwa osi y jest inna niż nazwa legendy.

Java firmy Kiran
źródło