2013-10-01 13 views
87

TL; DR -> Come si può creare una legenda per un grafico a linee in Matplotlib s' PyPlot senza creare variabili aggiuntive?L'aggiunta di una leggenda per PyPlot in Matplotlib nel modo più semplice modo possibile

perche lo script grafica qui sotto:

if __name__ == '__main__': 
    PyPlot.plot(total_lengths, sort_times_bubble, 'b-', 
       total_lengths, sort_times_ins, 'r-', 
       total_lengths, sort_times_merge_r, 'g+', 
       total_lengths, sort_times_merge_i, 'p-',) 
    PyPlot.title("Combined Statistics") 
    PyPlot.xlabel("Length of list (number)") 
    PyPlot.ylabel("Time taken (seconds)") 
    PyPlot.show() 

Come si può vedere, si tratta di un uso di base di matplotlib s' PyPlot. Questo genera idealmente un grafico come quello qui sotto:

Graph

Niente di speciale, lo so. Tuttavia, non è chiaro su quali dati vengano tracciati dove (sto cercando di tracciare i dati di alcuni algoritmi di ordinamento, la lunghezza rispetto al tempo impiegato, e mi piacerebbe assicurarmi che le persone sappiano quale linea è quale). Così, ho bisogno di una leggenda, però, dare un'occhiata al seguente esempio che segue (from the official site):

ax = subplot(1,1,1) 
p1, = ax.plot([1,2,3], label="line 1") 
p2, = ax.plot([3,2,1], label="line 2") 
p3, = ax.plot([2,3,1], label="line 3") 

handles, labels = ax.get_legend_handles_labels() 

# reverse the order 
ax.legend(handles[::-1], labels[::-1]) 

# or sort them by labels 
import operator 
hl = sorted(zip(handles, labels), 
      key=operator.itemgetter(1)) 
handles2, labels2 = zip(*hl) 

ax.legend(handles2, labels2) 

Vedrete che ho bisogno di creare una variabile in più ax. Come posso aggiungere una legenda al mio grafico senza dovendo creare questa variabile extra e mantenendo la semplicità del mio script corrente.

+0

Sono confuso dalla tua preoccupazione di creare una variabile extra. Devi comunque realizzare quegli oggetti dietro le quinte. – tacaswell

+0

@tcaswell Bene fammi provare a calmarli. Non voglio creare variabili extra, perché aggiunge complessità all'intero script. Sto cercando di spiegare questo a un gruppo di studenti, e poiché non hanno mai usato 'matplotlib' prima, volevo mantenere le cose il più semplice possibile. Inoltre, se dai un'occhiata alla risposta di Rob, è molto più semplice dell'esempio mostrato sul sito web. Spero che aiuti. –

+0

Direi che usare l'interfaccia della macchina di stato lo rende _harder_ da capire a lungo termine perché gran parte di essa viene eseguita "per magia". Inoltre, la convenzione usa 'import matplotlib.pyplot as plt' invece di' PyPlot' – tacaswell

risposta

156

Aggiungere un label= a ciascuna delle chiamate plot() e quindi chiamare legend(loc='upper left').

Considerate questo esempio:

import numpy as np 
import pylab 
x = np.linspace(0, 20, 1000) 
y1 = np.sin(x) 
y2 = np.cos(x) 

pylab.plot(x, y1, '-b', label='sine') 
pylab.plot(x, y2, '-r', label='cosine') 
pylab.legend(loc='upper left') 
pylab.ylim(-1.5, 2.0) 
pylab.show() 

enter image description here Leggermente modificato da questo tutorial: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

+1

C'è un modo per farlo se non si Conoscere le etichette al momento della creazione della serie? Cioè un modo per aggiungere etichette a una serie dopo che è già stata tracciata? O forse un modo per modificare le etichette dei segnaposto prima di mostrare la legenda? – meowsqueak

+1

'plt.legend (loc = 'in alto a sinistra')' funziona anche, dove 'plt' proviene da' import matplotlib.pyplot as plt'. –

5

aggiungere etichette a ogni argomento nella chiamata terreno corrispondente alla serie è graficamente, vale a dire label = "series 1"

Poi basta aggiungere Pyplot.legend() alla parte inferiore del vostro script e la leggenda visualizzerà queste etichette.

+0

Questa è l'idea giusta, ma non si aggiungono mai le etichette in modo che la legenda sia vuota – tacaswell

1

Ecco un esempio per aiutarvi ...

fig = plt.figure(figsize=(10,5)) 
ax = fig.add_subplot(111) 
ax.set_title('ADR vs Rating (CS:GO)') 
ax.scatter(x=data[:,0],y=data[:,1],label='Data') 
plt.plot(data[:,0], m*data[:,0] + b,color='red',label='Our Fitting 
Line') 
ax.set_xlabel('ADR') 
ax.set_ylabel('Rating') 
ax.legend(loc='best') 
plt.show() 

enter image description here

1

È possibile accedere all'istanza Axes (ax) con plt.gca().In questo caso, è possibile utilizzare

plt.gca().legend() 

È possibile eseguire questa operazione utilizzando la parola chiave label= in ciascuno dei vostri plt.plot() chiamate o assegnando le etichette come una tupla all'interno legend, come in questo esempio di lavoro:

import numpy as np 
import matplotlib.pyplot as plt 
x = np.linspace(-0.75,1,100) 
y0 = np.exp(2 + 3*x - 7*x**3) 
y1 = 7-4*np.sin(4*x) 
plt.plot(x,y0,x,y1) 
plt.gca().legend(('y0','y1')) 
plt.show() 

pltGcaLegend

Tuttavia, se avete bisogno di accedere all'istanza più assi che, una volta, mi faccio consigliare il salvataggio alla variabile ax con

ax = plt.gca() 

e quindi chiamando ax invece di plt.gca().

Problemi correlati