Aggiunta di una legenda a PyPlot in Matplotlib nel modo più semplice possibile


263

TL; DR -> Come si può creare una legenda per un grafico a linee in Matplotlibs' PyPlotsenza creare variabili aggiuntive?

Si prega di considerare lo script grafico 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 matplotlibs' PyPlot. Questo genera idealmente un grafico come quello qui sotto:

Grafico

Niente di speciale, lo so. Tuttavia, non è chiaro quali dati vengano tracciati dove (sto cercando di tracciare i dati di alcuni algoritmi di ordinamento, la lunghezza rispetto al tempo impiegato e vorrei assicurarmi che le persone sapessero quale linea fosse quale). Pertanto, ho bisogno di una legenda, tuttavia, dando un'occhiata al seguente esempio di seguito ( dal sito ufficiale ):

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)

Vedrai che devo creare una variabile aggiuntiva ax. Come posso aggiungere una legenda al mio grafico senza dover creare questa variabile aggiuntiva e conservare la semplicità del mio script attuale?


Sono confuso dalla tua preoccupazione di creare una variabile aggiuntiva. Devi comunque creare quegli oggetti dietro le quinte.
Tacaswell,

1
@tcaswell Beh, lasciami provare ad assillarli. Non voglio creare variabili extra, perché aggiunge complessità all'intero script. Sto cercando di insegnare questo a un gruppo di studenti e, poiché non li hanno mai usati matplotlibprima, volevo che le cose fossero il più semplici possibile. Inoltre, se dai un'occhiata alla risposta di Rob, è molto più semplice dell'esempio mostrato sul sito web. Spero che aiuti.
Giochi Brainiac,

1
Direi che l'uso dell'interfaccia della macchina a stati rende più difficile la comprensione a lungo termine perché gran parte di essa viene fatta "per magia". Inoltre, la convenzione è da utilizzare import matplotlib.pyplot as pltinvece diPyPlot
tacaswell,

Risposte:


441

Aggiungi label=a ciascuna delle tue plot()chiamate, quindi chiama legend(loc='upper left').

Considera questo esempio (testato con Python 3.8.0):

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 1000)
y1 = np.sin(x)
y2 = np.cos(x)

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

inserisci qui la descrizione dell'immagine Leggermente modificato da questo tutorial: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html


2
C'è un modo per farlo se non si conoscono le etichette al momento della stampa della serie? Vale a dire 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?
David,

13
plt.legend(loc='upper left')funziona anche da dove pltviene import matplotlib.pyplot as plt.
Matt Kleinsmith il

Grazie, @eric, per averlo notato. Ho aggiornato il codice.
Robᵩ

È stato votato perché lo overflow dello stack è fantastico e le buone risposte possono cambiare
eric

1
@davidA Sì, puoi semplicemente passare un elenco di stringhe in plt.legend:plt.legend(['First Label', 'Second Label'])
Apollys supporta Monica il

36

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

plt.gca().legend()

Puoi farlo utilizzando la label=parola chiave in ciascuna delle tue plt.plot()chiamate o assegnando le etichette come tupla o elenco all'interno legend, come in questo esempio funzionante:

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 è necessario accedere all'istanza Axes più di una volta, si consiglia di salvarlo nella variabile axcon

ax = plt.gca()

e quindi chiamare axinvece di plt.gca().


copia-incolla la risposta che non richiede alcuna lettura e con una foto! questa risposta merita più credito
Gulzar,

14

Ecco un esempio per aiutarti ...

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

inserisci qui la descrizione dell'immagine


2
Sono solo curioso, perché la tua linea di adattamento è così lontana dai dati?
Apollys supporta Monica il

13

Una trama semplice per curve seno e coseno con una leggenda.

Usato matplotlib.pyplot

import math
import matplotlib.pyplot as plt
x=[]
for i in range(-314,314):
    x.append(i/100)
ysin=[math.sin(i) for i in x]
ycos=[math.cos(i) for i in x]
plt.plot(x,ysin,label='sin(x)')  #specify label for the corresponding curve
plt.plot(x,ycos,label='cos(x)')
plt.xticks([-3.14,-1.57,0,1.57,3.14],['-$\pi$','-$\pi$/2',0,'$\pi$/2','$\pi$'])
plt.legend()
plt.show()

Diagrammi di peccato e coseno (clicca per vedere l'immagine)


6

Aggiungi etichette a ciascun argomento nella tua chiamata alla trama corrispondente alla serie che sta rappresentando, ad es label = "series 1"

Quindi aggiungi semplicemente Pyplot.legend()in fondo allo script e la legenda visualizzerà queste etichette.


Questa è l'idea giusta, ma non aggiungi mai le etichette, quindi la leggenda sarà vuota
tacaswell,

4

Puoi aggiungere una legenda personalizzata documentazione della

first = [1, 2, 4, 5, 4]
second = [3, 4, 2, 2, 3]
plt.plot(first,'g--', second, 'r--')
plt.legend(['First List','Second List'], loc='upper left')
plt.show()

inserisci qui la descrizione dell'immagine


0
    # Dependencies
    import numpy as np
    import matplotlib.pyplot as plt

    #Set Axes
    # Set x axis to numerical value for month
    x_axis_data = np.arange(1,13,1)
    x_axis_data

    # Average weather temp
    points = [39, 42, 51, 62, 72, 82, 86, 84, 77, 65, 55, 44]

    # Plot the line
    plt.plot(x_axis_data, points)
    plt.show()

    # Convert to Celsius C = (F-32) * 0.56
    points_C = [round((x-32) * 0.56,2) for x in points]
    points_C

    # Plot using Celsius
    plt.plot(x_axis_data, points_C)
    plt.show()

    # Plot both on the same chart
    plt.plot(x_axis_data, points)
    plt.plot(x_axis_data, points_C)

    #Line colors
    plt.plot(x_axis_data, points, "-b", label="F")
    plt.plot(x_axis_data, points_C, "-r", label="C")

    #locate legend
    plt.legend(loc="upper left")
    plt.show()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.