2012-02-13 14 views
8

Ecco un diagramma semplificato della situazione:Matplotlib, leggenda con più marcatori diversi, con una sola etichetta

plot example

Invece di avere ogni marcatore punto di dati hanno un'etichetta separata, voglio essere in grado di avere un'etichetta per un insieme di marcatori diversi. Mi piacerebbe essere in grado di avere una leggenda come:

<triangle> <square> <hexagon> <diamond> <circle> Shotcrete strength data points 
<green line> 10 minute strength 
<blue line> 60 minute strength 
<yellow line> 1 day strength 
<orange line> 7 day strength 
<red line> 28 day strength 

che voglio fare questo perché nella scena finale avrò tre serie di punti di dati e che mostrano 18 (3 serie * 6 punti/set) marcatore/combinazioni di etichette saranno disordinate.

Sto usando Matplotlib con Python 2.7.

risposta

3

Nota: questa risposta viene mantenuta come guida per la risposta corretta, ma non risolve il problema indicato. Si prega di vedere la modifica qui sotto per il problema delle collezioni di patch che non sono supportate in matplotlib.


Un modo per andare su questo, se si desidera che completa personalizzazione è quello di utilizzare una cosiddetta Artista Proxy:

from pylab import * 

p1 = Rectangle((0, 0), 1, 1, fc="r") 
p2 = Circle((0, 0), fc="b") 
p3 = plot([10,20],'g--') 
legend([p1,p2,p3], ["Red Rectangle","Blue Circle","Green-dash"]) 

show() 

Qui è possibile specificare esattamente quello che vuoi la leggenda per assomigliare, e anche usare forme di trama non standard (patch).

Modifica: C'è qualche difficoltà con questo metodo, matplotlib only supports these Artists in a legend senza modifiche. Per matplotlib v1.0 e precedenti, gli artisti supportati sono i seguenti.

Line2D 
Patch 
LineCollection 
RegularPolyCollection 
CircleCollection 

La tua richiesta di più punti di dispersione sarebbe stato fatto con un Patch Collection, che non è supportato sopra. In teoria con la v1.1, questo è possibile ma non vedo come.

+1

Attualmente sto usando le linee di psuedo per rendere la mia leggenda. Penso che potrei essere in grado di utilizzare qualcosa del genere (http://matplotlib.sourceforge.net/users/legend_guide.html#legend-handler): 'codice' z = np.random.randn (10) p1a, = plt.plot (z, "ro", ms = 10, mfc = "r", mew = 2, mec = "r") # cerchio rosso riempito p1b, = plt.plot (z [: 5 ], "w +", ms = 10, mec = "w", mew = 2) # croce bianca plt.legend ([p1a, (p1a, p1b)], ["Attr A", "Attr A + B "]) ' code' per combinare più marker su una riga. – CrazyArm

+0

@CrazyArm, per quanto ho capito, dovrai definire una forma personalizzata per '' ed è per questo che ho dato la soluzione come ho fatto io. Potresti essere in grado di estrarre la forma del simbolo dalla fonte del grafico a dispersione (o dalla dispersione stessa) e usarla con la forma personalizzata come input per 'legend'. – Hooked

+0

Grazie. Penso di capire come creare un singolo marcatore personalizzato nella legenda (un rettangolo o un cerchio come hai detto), ma non so come combinare due di essi. Questo (http://matplotlib.sourceforge.net/examples/api/scatter_piecharts.html) lo fa sovrapponendo più simboli, ma non so come lo mostrerebbero su una legenda. – CrazyArm

Problemi correlati