Suche…


Einfache Legende

Angenommen, Sie haben mehrere Linien in derselben Grafik, jede mit einer anderen Farbe, und Sie möchten eine Legende erstellen, um zu erkennen, was jede Linie darstellt. Sie können dies tun, indem Sie bei Aufruf von plot() eine Beschriftung an jede der Zeilen übergeben, z. B. wird die folgende Zeile mit "My Line 1" bezeichnet .

ax.plot(x, y1, color="red", label="My Line 1")

Dies gibt den Text an, der in der Legende für diese Zeile angezeigt wird. Um die eigentliche Legende sichtbar zu machen, können wir ax.legend()

Standardmäßig wird eine Legende in einem Kästchen in der oberen rechten Ecke des Diagramms erstellt. Sie können Argumente an legend() , um sie anzupassen. Zum Beispiel können wir es in der unteren rechten Ecke positionieren, ohne ein Rahmenrahmen, und einen Titel für die Legende erstellen, indem Sie Folgendes aufrufen:

ax.legend(loc="lower right", title="Legend Title", frameon=False)

Unten ist ein Beispiel:

Bild des einfachen Legendenbeispiels

import matplotlib.pyplot as plt

# The data
x =  [1, 2, 3]
y1 = [2,  15, 27]
y2 = [10, 40, 45]
y3 = [5,  25, 40]

# Initialize the figure and axes
fig, ax = plt.subplots(1, figsize=(8, 6))

# Set the title for the figure
fig.suptitle('Simple Legend Example ', fontsize=15)

# Draw all the lines in the same plot, assigning a label for each one to be
# shown in the legend
ax.plot(x, y1, color="red", label="My Line 1")
ax.plot(x, y2, color="green", label="My Line 2")
ax.plot(x, y3, color="blue", label="My Line 3")

# Add a legend with title, position it on the lower right (loc) with no box framing (frameon)
ax.legend(loc="lower right", title="Legend Title", frameon=False)

# Show the plot
plt.show()

Legende außerhalb des Grundstücks platziert

Manchmal ist es notwendig oder wünschenswert, die Legende außerhalb der Handlung zu platzieren. Der folgende Code zeigt, wie das geht.

Bild der Handlung mit Legende außerhalb der Handlung

import matplotlib.pylab as plt
fig, ax = plt.subplots(1, 1, figsize=(10,6)) # make the figure with the size 10 x 6 inches
fig.suptitle('Example of a Legend Being Placed Outside of Plot')

# The data
x =  [1, 2, 3]
y1 = [1, 2, 4]
y2 = [2, 4, 8]
y3 = [3, 5, 14]

# Labels to use for each line
line_labels = ["Item A", "Item B", "Item C"]

# Create the lines, assigning different colors for each one.
# Also store the created line objects
l1 = ax.plot(x, y1, color="red")[0]
l2 = ax.plot(x, y2, color="green")[0]
l3 = ax.plot(x, y3, color="blue")[0]

fig.legend([l1, l2, l3],              # List of the line objects
           labels= line_labels,       # The labels for each line
           loc="center right",        # Position of the legend
           borderaxespad=0.1,         # Add little spacing around the legend box
           title="Legend Title")      # Title for the legend

# Adjust the scaling factor to fit your legend text completely outside the plot
# (smaller value results in more space being made for the legend)
plt.subplots_adjust(right=0.85)

plt.show()

Eine andere Möglichkeit, die Legende außerhalb der bbox_to_anchor bbox_extra_artists ist die Verwendung von bbox_to_anchor + bbox_extra_artists + bbox_inches='tight' , wie im folgenden Beispiel gezeigt:

Geben Sie hier die Bildbeschreibung ein

import matplotlib.pyplot as plt

# Data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# Plot
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(all_x, all_y)

# Add legend, title and axis labels
lgd = ax.legend([ 'Lag ' + str(lag) for lag in all_x], loc='center right', bbox_to_anchor=(1.3, 0.5))
ax.set_title('Title')
ax.set_xlabel('x label')
ax.set_ylabel('y label')    

fig.savefig('image_output.png',
            dpi=300, 
            format='png', 
            bbox_extra_artists=(lgd,),
            bbox_inches='tight')

Einzelne Legende für mehrere Subplots freigegeben

Manchmal verfügen Sie über ein Raster von Subplots, und Sie möchten eine einzelne Legende haben, in der alle Zeilen für jedes der Subplots wie im folgenden Bild beschrieben werden.

Bild der einzelnen Legende über mehrere Untergrundstücke

Um dies zu tun, müssen Sie eine globale Legende für die Figur erstellen , anstatt eine Legende auf den Achsen Ebene zu schaffen (die eine eigene Legende für jede subplot schaffen). Dies wird durch Aufrufen von fig.legend() wie im Code für den folgenden Code zu sehen ist.

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(10,4))
fig.suptitle('Example of a Single Legend Shared Across Multiple Subplots')

# The data
x =  [1, 2, 3]
y1 = [1, 2, 3]
y2 = [3, 1, 3]
y3 = [1, 3, 1]
y4 = [2, 2, 3]

# Labels to use in the legend for each line
line_labels = ["Line A", "Line B", "Line C", "Line D"]

# Create the sub-plots, assigning a different color for each line.
# Also store the line objects created
l1 = ax1.plot(x, y1, color="red")[0]
l2 = ax2.plot(x, y2, color="green")[0]
l3 = ax3.plot(x, y3, color="blue")[0]
l4 = ax3.plot(x, y4, color="orange")[0] # A second line in the third subplot

# Create the legend
fig.legend([l1, l2, l3, l4],     # The line objects
           labels=line_labels,   # The labels for each line
           loc="center right",   # Position of legend
           borderaxespad=0.1,    # Small spacing around legend box
           title="Legend Title"  # Title for the legend
           )

# Adjust the scaling factor to fit your legend text completely outside the plot
# (smaller value results in more space being made for the legend)
plt.subplots_adjust(right=0.85)

plt.show()

Zu dem obigen Beispiel ist Folgendes zu beachten:

l1 = ax1.plot(x, y1, color="red")[0]

Wenn plot() aufgerufen wird, wird eine Liste von line2D- Objekten zurückgegeben. In diesem Fall wird nur eine Liste mit einem einzelnen line2D- Objekt zurückgegeben, die mit der Indexierung [0] extrahiert und in l1 gespeichert wird.

Eine Liste aller line2D- Objekte, an denen wir interessiert sind, einschließlich der Legende, muss als erstes Argument an fig.legend() . Das zweite Argument zu fig.legend() ist ebenfalls notwendig. Es soll eine Liste von Strings sein, die als Beschriftungen für jede Zeile in der Legende verwendet werden.

Die anderen Argumente, die an fig.legend() sind rein optional und helfen nur bei der Feinabstimmung der Ästhetik der Legende.

Mehrere Legenden auf derselben Achse

Wenn Sie plt.legend() oder ax.legend() mehrmals ax.legend() , wird die erste Legende entfernt und eine neue Legende gezeichnet. Nach den offiziellen Unterlagen :

Dies wurde gemacht, damit der Befehl legend () wiederholt aufgerufen werden kann, um die Legende auf die neuesten Ziehpunkte der Achsen zu aktualisieren

Aber keine Angst: Es ist immer noch recht einfach, einer Achse eine zweite Legende (oder eine dritte oder vierte) hinzuzufügen. In diesem Beispiel zeichnen wir zwei Linien und dann Marker auf ihren jeweiligen Maxima und Minima. Eine Legende bezieht sich auf die Linien und die andere auf die Markierungen.

import matplotlib.pyplot as plt
import numpy as np

# Generate data for plotting:  
x = np.linspace(0,2*np.pi,100)
y0 = np.sin(x)
y1 = .9*np.sin(.9*x)
# Find their maxima and minima and store
maxes = np.empty((2,2))
mins = np.empty((2,2))
for k,y in enumerate([y0,y1]):
    maxloc = y.argmax()
    maxes[k] = x[maxloc], y[maxloc]
    minloc = y.argmin()
    mins[k] = x[minloc], y[minloc]

# Instantiate figure and plot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y0, label='y0')
ax.plot(x,y1, label='y1')
# Plot maxima and minima, and keep references to the lines
maxline, = ax.plot(maxes[:,0], maxes[:,1], 'r^')
minline, = ax.plot(mins[:,0], mins[:,1], 'ko')

# Add first legend:  only labeled data is included
leg1 = ax.legend(loc='lower left')
# Add second legend for the maxes and mins.
# leg1 will be removed from figure
leg2 = ax.legend([maxline,minline],['max','min'], loc='upper right')
# Manually add the first legend back
ax.add_artist(leg1)

Geben Sie hier die Bildbeschreibung ein

Der Schlüssel ist, um sicherzustellen, dass Sie Verweise auf die Legendenobjekte haben. Die erste leg1 Sie instanziieren ( leg1 ), wird aus der Figur entfernt, wenn Sie die zweite hinzufügen. Das leg1 Objekt ist jedoch noch vorhanden und kann mit ax.add_artist wieder ax.add_artist .

Das wirklich Tolle ist, dass man beide Legenden noch manipulieren kann. Fügen Sie beispielsweise am Ende des obigen Codes Folgendes hinzu:

leg1.get_lines()[0].set_lw(8)
leg2.get_texts()[1].set_color('b')

Geben Sie hier die Bildbeschreibung ein

Schließlich ist es erwähnenswert, dass im Beispiel nur die Linien beim ax.legend() mit Beschriftungen versehen wurden, was bedeutet, dass ax.legend() nur diese Zeilen zum leg1 . Die Legende für die Marker ( leg2 ) erforderte daher die Zeilen und Bezeichnungen als Argumente, wenn sie instanziiert wurden. Alternativ könnten wir die Markierungen auch beschriftet haben, wenn sie gezeichnet wurden. Aber dann hätten beide Aufrufe von ax.legend zusätzliche Argumente benötigt, so dass jede Legende nur die Elemente enthielt, die wir wollten.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow