2012-08-16 2 views
53
nicht

Seit matplotlib Upgrade ich die folgende Fehlermeldung erhalten, wenn eine Legende zu schaffen versuchen:Matplotlib Legends arbeitet

/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 sogar mit einem trivialen Skript wie folgt auftritt:

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 Ich habe den Link gefunden, auf den der Fehler hinweist, ziemlich nutzlos, um die Fehlerquelle zu diagnostizieren.

Antwort

107

Sie sollten Komma hinzu:

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

Der Grund, warum Sie die Kommas müssen, weil plt.plot() ein Tupel von Linienobjekten gibt, egal wie viele aus dem Befehl tatsächlich erstellt. Ohne das Komma sind "plot1" und "plot2" Tupel anstelle von Linienobjekten, wodurch der spätere Aufruf von plt.legend() fehlschlägt.

Das Komma auspackt implizit die Ergebnisse so, dass anstelle eines Tupels „Plot1“ und „Plot2“ automatisch die ersten Objekte innerhalb des Tupel werden, das heißt, die Linienobjekte Sie eigentlich wollen.

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

heißt, ziemlich obskure Sachen gearbeitet! –

+2

könnten Sie die Erklärung hier kopieren/hinzufügen? stackoverflow unterstützt kopierrelevante Teile vor Ort (Hervorhebung, Archivierung) – n611x007

5

Verwendung 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

Verwenden Sie das "label" Stichwort, etwa so:

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

und anschließend die Legende hinzufügen wie folgt:

pyplot.legend() 

Die Legende wird Linieneigenschaften wie Dicke, Farben behalten, usw.

enter image description here