487 Stimmen

Hinzufügen einer matplotlib Legende

Wie kann man eine Legende für ein Liniendiagramm in Matplotlibs PyPlot erstellen, ohne zusätzliche Variablen zu erstellen?

Bitte beachten Sie das folgende Diagrammskript:

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("Kombinierte Statistiken")
    PyPlot.xlabel("Länge der Liste (Anzahl)")
    PyPlot.ylabel("Zeit (in Sekunden)")
    PyPlot.show()

Wie Sie sehen können, handelt es sich hierbei um eine sehr einfache Verwendung von Matplotlibs PyPlot. Dies erzeugt idealerweise ein Diagramm wie das folgende:

Graph

Nichts Besonderes, ich weiß. Es ist jedoch unklar, welche Daten wo dargestellt werden (ich versuche, die Daten einiger Sortieralgorithmen, Länge gegen benötigte Zeit, zu plotten, und ich möchte sicherstellen, dass die Leute wissen, welche Linie welche ist). Daher benötige ich eine Legende, jedoch, wenn Sie sich das folgende Beispiel unten ansehen (von der offiziellen Seite):

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

handles, labels = ax.get_legend_handles_labels()

# die Reihenfolge umkehren
ax.legend(handles[::-1], labels[::-1])

# oder nach Labels sortieren
import operator
hl = sorted(zip(handles, labels),
            key=operator.itemgetter(1))
handles2, labels2 = zip(*hl)

ax.legend(handles2, labels2)

Sie werden sehen, dass ich eine zusätzliche Variable ax erstellen muss. Wie kann ich meiner Grafik eine Legende hinzufügen, ohne diese zusätzliche Variable erstellen zu müssen und gleichzeitig die Einfachheit meines aktuellen Skripts beizubehalten?

808voto

Robᵩ Punkte 153060

Fügen Sie jedem Ihrer plot()-Aufrufe ein label= hinzu und rufen Sie dann legend(loc='oben links') auf.

Betrachten Sie dieses Beispiel (getestet mit 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="Sinus")
plt.plot(x, y2, "-r", label="Cosinus")
plt.legend(loc="oben links")
plt.ylim(-1.5, 2.0)
plt.show()

Bildbeschreibung eingeben Leicht modifiziert aus diesem Tutorial: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

62voto

cameronroytaylor Punkte 1388

Sie können auf die Axes-Instanz (ax) mit plt.gca() zugreifen. In diesem Fall können Sie verwenden

plt.gca().legend()

Sie können dies entweder tun, indem Sie das label=-Schlüsselwort in jedem Ihrer plt.plot()-Aufrufe verwenden oder indem Sie Ihre Labels als Tupel oder Liste innerhalb von legend zuweisen, wie in diesem funktionierenden Beispiel:

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

Wenn Sie jedoch mehrmals auf die Axes-Instanz zugreifen müssen, empfehle ich, sie in der Variablen ax zu speichern:

ax = plt.gca()

und dann ax anstelle von plt.gca() aufzurufen.

28voto

Akash Kandpal Punkte 2544

Hier ist ein Beispiel, um Ihnen zu helfen...

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='Daten')
plt.plot(data[:,0], m*data[:,0] + b,color='rot',label='Unsere Anpassungslinie')
ax.set_xlabel('ADR')
ax.set_ylabel('Rating')
ax.legend(loc='best')
plt.show()

Bildbeschreibung eingeben

25voto

Boris Yakubchik Punkte 3027

Sie können eine benutzerdefinierte Legende hinzufügen Dokumentation

erste = [1, 2, 4, 5, 4]
zweite = [3, 4, 2, 2, 3]
plt.plot(erste, 'g--', zweite, 'r--')
plt.legend(['Erste Liste', 'Zweite Liste'], loc='upper left')
plt.show()

Bildbeschreibung hier eingeben

15voto

sajalagrawal Punkte 151

Ein einfacher Plot für Sinus- und Cosinus-Kurven mit einer Legende.

Verwendet 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)')  #spezifizieren Sie die Beschriftung für die entsprechende Kurve
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()

Sinus- und Cosinus-Plots (zum Anzeigen auf das Bild klicken)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X