Matplotlib Legends funktioniert nicht

94

Seit dem Upgrade von matplotlib wird beim Erstellen einer Legende der folgende Fehler angezeigt:

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

Dies tritt sogar bei einem trivialen Skript wie diesem auf:

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

Ich habe den Link gefunden, dass der Fehler mich bei der Diagnose der Fehlerquelle auf ziemlich nutzlos hinweist.

Mike Vella
quelle

Antworten:

164

Sie sollten Kommas hinzufügen:

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

Der Grund, warum Sie die Kommas benötigen, ist, dass plt.plot () ein Tupel von Zeilenobjekten zurückgibt, unabhängig davon, wie viele tatsächlich aus dem Befehl erstellt wurden. Ohne Komma sind "plot1" und "plot2" Tupel anstelle von Linienobjekten, sodass der spätere Aufruf von plt.legend () fehlschlägt.

Das Komma entpackt die Ergebnisse implizit, sodass "plot1" und "plot2" anstelle eines Tupels automatisch die ersten Objekte innerhalb des Tupels werden, dh die Linienobjekte, die Sie tatsächlich möchten.

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

line, = plot (x, sin (x)) Wofür steht Komma?

applyative_functor
quelle
2
Könnten Sie die Erklärung hier kopieren / hinzufügen? Der Stapelüberlauf fördert das Kopieren relevanter Teile vor Ort (Hervorheben, Archivieren)
n611x007
15

Verwenden Sie das Schlüsselwort "label" wie folgt:

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

und fügen Sie dann die Legende wie folgt hinzu:

pyplot.legend()

Die Legende behält Linieneigenschaften wie Dicke, Farben usw. bei.

Geben Sie hier die Bildbeschreibung ein

Ytsen de Boer
quelle
9

Verwenden Sie 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
quelle
-1

Verwenden Sie beim Zeichnen des Diagramms die Beschriftung, dann können nur Sie die Legende verwenden. Der Name der x-Achse und der Name der y-Achse unterscheiden sich vom Namen der Legende.

Java von Kiran
quelle