Hinzufügen einer Matplotlib-Legende

Lesezeit: 6 Minuten

Spiele Benutzeravatar von Brainiac
Spiele Brainiac

Wie kann man eine Legende für ein Liniendiagramm in erstellen Matplotlib‘S PyPlot ohne 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 plotten, Länge gegen Zeitaufwand, und ich möchte sicherstellen, dass die Leute wissen, welche Zeile welche ist). Daher brauche ich jedoch eine Legende, wenn ich mir das folgende Beispiel unten anschaue (von der offiziellen Seite):

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 Muss ich diese zusätzliche Variable erstellen und die Einfachheit meines aktuellen Skripts beibehalten?

  • Ich bin verwirrt von Ihrer Sorge, eine zusätzliche Variable zu erstellen. Sie müssen diese Objekte sowieso hinter den Kulissen erstellen.

    – tacaswell

    1. Oktober 2013 um 21:01 Uhr

  • @tcaswell Nun, lass mich versuchen, sie zu beruhigen. Ich möchte keine zusätzlichen Variablen erstellen, da dies das gesamte Skript komplexer macht. Ich versuche zu unterrichten dies an ein paar Studenten, und da sie es nicht benutzt haben matplotlib Früher wollte ich die Dinge so einfach wie möglich halten. Wenn Sie sich auch Robs Antwort ansehen, ist sie viel einfacher als das auf der Website gezeigte Beispiel. Ich hoffe das hilft.

    – Spiele Brainiac

    1. Oktober 2013 um 21:08 Uhr


  • Ich würde argumentieren, dass die Verwendung der Zustandsmaschinenschnittstelle es macht Schwerer auf lange Sicht zu verstehen, weil so vieles davon „magisch“ geschieht. Auch die Konvention ist zu verwenden import matplotlib.pyplot as plt anstatt PyPlot

    – tacaswell

    1. Oktober 2013 um 21:55 Uhr

Benutzeravatar von Robᵩ
Robᵩ

Füge hinzu ein label= zu jedem von Ihnen plot() ruft an und ruft 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

Leicht modifiziert von diesem Tutorial: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

  • Gibt es eine Möglichkeit, dies zu tun, wenn Sie die Beschriftungen zum Zeitpunkt des Plottens der Serie nicht kennen? Dh eine Möglichkeit, Etiketten zu einer Serie hinzuzufügen, nachdem sie bereits geplottet wurde? Oder vielleicht eine Möglichkeit, Platzhalterbeschriftungen zu ändern, bevor die Legende angezeigt wird?

    – davidA

    5. Juli 2017 um 3:42 Uhr

  • plt.legend(loc='upper left') funktioniert auch, wo plt aus import matplotlib.pyplot as plt.

    – Matt Kleinsmith

    20. Januar 2018 um 8:10 Uhr


  • Hinweis für andere: die plt.legend() Forderung braucht sein nach plt.plot(label="lab1")

    – Mauriii

    25. November 2019 um 20:18 Uhr


  • @davidA Ja, Sie können einfach eine Liste von Zeichenfolgen übergeben plt.legend: plt.legend(['First Label', 'Second Label'])

    – Apollys unterstützt Monica

    12. Dezember 2019 um 23:41 Uhr


  • Ich bin mir sicher, dass die aktuelle Dokumentation unter: matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.legend.html beantwortet dies auch, aber es ist so mühsam, diese Informationen von dort im Vergleich zu hier zu bekommen. Wir müssen Dokumentation neu denken. lolz

    – Benutzer1953366

    25. April 2020 um 4:18 Uhr

Benutzeravatar von cameronroytaylor
Cameronroytaylor

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

plt.gca().legend()

Sie können dies entweder tun, indem Sie die verwenden label= Stichwort in jedem Ihrer plt.plot() Aufrufe oder indem Sie Ihre Labels als Tupel oder Liste darin zuweisen legendwie 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 mehr als einmal auf die Axes-Instanz zugreifen müssen, empfehle ich, sie in der Variablen zu speichern ax mit

ax = plt.gca()

und dann anrufen ax anstatt plt.gca().

  • Copy-Paste-Antwort, die kein Lesen erfordert, und mit einem Bild! Diese Antwort verdient mehr Anerkennung

    – Gülzar

    10. Juni 2019 um 13:59 Uhr

  • Hallo Cameron, ich habe versucht, Sie zu erreichen, und dies ist die beste Option, die ich gefunden habe … Sie sind der Autor eines sehr hilfreichen Tools, das ich häufig verwendet habe: web.media.mit.edu/~crtaylor/calculator.html Leider funktioniert es seit einiger Zeit nicht mehr. Bin ich es oder ist das Werkzeug kaputt. Wenn ja, können Sie es reparieren?

    – Thomas Wilde

    17. Dezember 2020 um 21:20 Uhr


  • Hoppla! Fest. Danke für die Nachricht! Ich hoffe, Sie haben etwas Nützliches über Axes-Instanzen gelernt 🙂

    – cameronroytaylor

    19. Dezember 2020 um 4:23 Uhr

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

  • Ich bin nur neugierig, warum ist Ihre Anpassungslinie so weit von den Daten entfernt?

    – Apollys unterstützt Monica

    12. Dezember 2019 um 23:28 Uhr

Benutzeravatar von Boris Yakubchik
Boris Jakubchik

Sie können eine benutzerdefinierte 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

Benutzeravatar von sajalagrawal
sajalagrawal

Ein einfaches Diagramm für Sinus- und Kosinuskurven 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 Cosinus-Diagramme (klicken, um das Bild anzuzeigen)

Fügen Sie jedem Argument in Ihrem Plot-Aufruf Beschriftungen hinzu, die der Reihe entsprechen, die es grafisch darstellt, dh label = "series 1"

Dann einfach hinzufügen Pyplot.legend() an das Ende Ihres Skripts und die Legende zeigt diese Beschriftungen an.

1448920cookie-checkHinzufügen einer Matplotlib-Legende

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy