Hinzufügen einer Legende zu PyPlot in Matplotlib auf einfachste Weise

263

TL; DR -> Wie kann man eine Legende für ein Liniendiagramm in erstellen Matplotlib‚s PyPlotohne zusätzliche Variablen zu erstellen?

Bitte beachten Sie das folgende Grafikskript:

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

Wie Sie sehen können, ist dies eine sehr grundlegende Verwendung von matplotlib's PyPlot. Dies erzeugt idealerweise ein Diagramm wie das folgende:

Graph

Nichts besonderes, ich weiß. Es ist jedoch unklar, welche Daten wo geplottet werden (ich versuche, die Daten einiger Sortieralgorithmen zu zeichnen, Länge gegen Zeit, und ich möchte sicherstellen, dass die Leute wissen, welche Linie welche ist). Daher brauche ich jedoch eine Legende, die sich das folgende Beispiel ( von der offiziellen Website ) ansieht :

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)

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

Spiele Brainiac
quelle
Ich bin verwirrt über Ihr Anliegen, eine zusätzliche Variable zu erstellen. Sie müssen diese Objekte sowieso hinter den Kulissen machen.
Tacaswell
1
@tcaswell Nun, lassen Sie mich versuchen, sie zu beruhigen. Ich möchte keine zusätzlichen Variablen erstellen, da dies das gesamte Skript komplexer macht. Ich versuche , dies einer Gruppe von Schülern beizubringen , und da sie es vorher noch nicht benutzt matplotlibhaben, wollte ich die Dinge so einfach wie möglich halten. Wenn Sie sich Robs Antwort ansehen, ist sie weitaus einfacher als das auf der Website gezeigte Beispiel. Ich hoffe das hilft.
Spiele Brainiac
1
Ich würde behaupten , dass die Zustandsmaschine - Schnittstelle macht es schwieriger , auf lange Sicht zu verstehen , weil so viel davon ‚durch Magie‘ getan wird. Außerdem ist die Konvention import matplotlib.pyplot as pltanstelle vonPyPlot
Tacaswell

Antworten:

441

Fügen Sie label=jedem Ihrer plot()Anrufe ein hinzu und rufen Sie dann an legend(loc='upper left').

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="sine")
plt.plot(x, y2, "-r", label="cosine")
plt.legend(loc="upper left")
plt.ylim(-1.5, 2.0)
plt.show()

Geben Sie hier die Bildbeschreibung ein Von diesem Tutorial leicht modifiziert: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

Robᵩ
quelle
2
Gibt es eine Möglichkeit, dies zu tun, wenn Sie die Beschriftungen zum Zeitpunkt der Darstellung der Serie nicht kennen? Dh eine Möglichkeit, einer Serie Beschriftungen hinzuzufügen, nachdem sie bereits geplottet wurde? Oder vielleicht eine Möglichkeit, Platzhalterbeschriftungen zu ändern, bevor die Legende angezeigt wird?
DavidA
13
plt.legend(loc='upper left')funktioniert auch, woher pltkommt import matplotlib.pyplot as plt.
Matt Kleinsmith
Danke, @eric, dass du das bemerkt hast. Ich habe den Code aktualisiert.
Robᵩ
Upvoted, weil Stapelüberlauf fantastisch ist und gute Antworten sich ändern können
eric
1
@davidA Ja, Sie können einfach eine Liste von Zeichenfolgen übergeben an plt.legend:plt.legend(['First Label', 'Second Label'])
Apollys unterstützt Monica
36

Sie können mit auf die Axes-Instanz ( ax) zugreifen plt.gca(). 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()Anrufe verwenden oder indem Sie Ihre Beschriftungen als Tupel oder Liste darin zuweisen legend, wie in diesem Arbeitsbeispiel:

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 axmit zu speichern

ax = plt.gca()

und dann anrufen axstatt plt.gca().

cameronroytaylor
quelle
Antwort zum Kopieren und Einfügen, die nicht gelesen werden muss, und mit einem Bild! Diese Antwort verdient mehr Anerkennung
Gulzar
14

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

Geben Sie hier die Bildbeschreibung ein

Akash Kandpal
quelle
2
Ich bin nur neugierig, warum ist Ihre Anpassungslinie so weit von den Daten entfernt?
Apollys unterstützt Monica
13

Ein einfaches Diagramm für Sinus- und Cosinuskurven mit einer Legende.

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

Sin- und Cosine-Diagramme (Klicken, um das Bild anzuzeigen)

Sajalagrawal
quelle
6

Fügen Sie jedem Argument in Ihrem Plotaufruf Beschriftungen hinzu, die der grafisch dargestellten Reihe entsprechen, d. H. label = "series 1"

Fügen Sie dann einfach Pyplot.legend()am Ende Ihres Skripts hinzu, und die Legende zeigt diese Beschriftungen an.

blaklaybul
quelle
Dies ist die richtige Idee, aber Sie fügen niemals die Etiketten hinzu, damit die Legende leer
bleibt
4

Sie können eine eigene Legende hinzufügen Dokumentation

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

Geben Sie hier die Bildbeschreibung ein

Boris Yakubchik
quelle
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()
James Turner
quelle