Skip to content

Matplotlib Legend: Vollständige Anleitung zum Hinzufügen und Anpassen von Legenden

Updated on

Ein Diagramm ohne Legende zwingt den Leser zu raten, welche Linie welche ist. Man gleicht Farben im Kopf ab, liest Daten falsch ab und zieht falsche Schlüsse. Eine Legende mit plt.legend() hinzuzufügen ist einfach -- aber zu kontrollieren, wo sie erscheint, wie sie aussieht und sie davon abzuhalten, Ihre Daten zu verdecken, erfordert mehr Arbeit als die meisten Tutorials zeigen.

Dieser Leitfaden behandelt alles von der grundlegenden Legendenerstellung bis zur erweiterten Anpassung: Platzierung innerhalb und außerhalb des Plots, mehrspaltige Layouts, benutzerdefinierte Handles und Legenden für komplexe Abbildungen.

📚

Grundlegende Legende

Automatische Labels

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.show()

Der label-Parameter in plot() definiert, was in der Legende erscheint. Rufen Sie plt.legend() auf, um sie anzuzeigen.

Objektorientierter Stil

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.legend()
plt.show()

Legendenplatzierung

Verwendung des loc-Parameters

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
 
# Gängige Positionen
ax.legend(loc='upper right')   # Standard
# ax.legend(loc='upper left')
# ax.legend(loc='lower right')
# ax.legend(loc='lower left')
# ax.legend(loc='center')
# ax.legend(loc='best')  # Wählt automatisch die Position mit der geringsten Überlappung
plt.show()

Alle loc-Optionen

loc-Stringloc-Nummer
'best'0
'upper right'1
'upper left'2
'lower left'3
'lower right'4
'right'5
'center left'6
'center right'7
'lower center'8
'upper center'9
'center'10

Präzise Positionierung mit bbox_to_anchor

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.plot(x, np.sin(x) + np.cos(x), label='sin(x) + cos(x)')
 
# Legende an bestimmten Koordinaten (x, y) im Achsenanteil positionieren
ax.legend(loc='upper left', bbox_to_anchor=(0.02, 0.98))
plt.show()

Legende außerhalb des Plots

Wenn die Legende Daten überlappt, verschieben Sie sie nach außen:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
fig, ax = plt.subplots(figsize=(10, 5))
for i in range(6):
    ax.plot(x, np.sin(x + i * 0.5), label=f'Phase {i}')
 
# Legende rechts vom Plot platzieren
ax.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
fig, ax = plt.subplots(figsize=(8, 6))
for i in range(5):
    ax.plot(x, np.sin(x + i), label=f'Series {i+1}')
 
# Legende unter dem Plot platzieren
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=5)
plt.tight_layout()
plt.show()

Legende gestalten

Schriftgröße und Rahmen

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
 
ax.legend(
    fontsize=12,
    frameon=True,          # Rahmen anzeigen (Standard True)
    framealpha=0.8,        # Rahmentransparenz
    facecolor='lightyellow',  # Hintergrundfarbe
    edgecolor='gray',      # Rahmenfarbe
    shadow=True,           # Schlagschatten
)
plt.show()

Mehrspaltiges Layout

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
fig, ax = plt.subplots(figsize=(10, 5))
for i in range(8):
    ax.plot(x, np.sin(x + i * 0.4), label=f'Signal {i+1}')
 
# 4 Spalten für kompakte Legende
ax.legend(ncol=4, loc='upper center', fontsize=9)
plt.show()

Legendentitel

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, x**2, label='Quadratic')
ax.plot(x, x**1.5, label='Power 1.5')
ax.plot(x, x, label='Linear')
 
ax.legend(title='Wachstumsmodelle', title_fontsize=13, fontsize=11)
plt.show()

Benutzerdefinierte Legenden-Handles

Manuelle Legendeneinträge

import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.lines as mlines
import numpy as np
 
fig, ax = plt.subplots(figsize=(8, 5))
 
# Ohne Labels plotten
ax.scatter(np.random.randn(50), np.random.randn(50), c='blue', s=20)
ax.scatter(np.random.randn(50) + 2, np.random.randn(50), c='red', s=20)
 
# Benutzerdefinierte Handles erstellen
blue_patch = mpatches.Patch(color='blue', label='Gruppe A')
red_patch = mpatches.Patch(color='red', label='Gruppe B')
line_handle = mlines.Line2D([], [], color='green', linestyle='--', label='Schwellenwert')
 
ax.legend(handles=[blue_patch, red_patch, line_handle])
plt.show()

Legende für Streudiagramm mit Farbzuordnung

import matplotlib.pyplot as plt
import numpy as np
 
fig, ax = plt.subplots(figsize=(8, 5))
 
categories = ['A', 'B', 'C']
colors = ['#e74c3c', '#3498db', '#2ecc71']
 
for cat, color in zip(categories, colors):
    x = np.random.randn(30)
    y = np.random.randn(30)
    ax.scatter(x, y, c=color, label=f'Kategorie {cat}', alpha=0.7, s=50)
 
ax.legend()
plt.show()

Anpassungsoptionen für Legenden

ParameterBeschreibungBeispiel
locPositionsstring oder -nummer'upper right', 2
bbox_to_anchorAnkerpunkt (x, y)(1.0, 0.5)
ncolAnzahl der Spalten3
fontsizeTextgröße12, 'small'
titleLegendentitel'My Legend'
frameonRahmen anzeigenTrue, False
framealphaRahmentransparenz0.8
facecolorHintergrundfarbe'white'
edgecolorRahmenfarbe'gray'
shadowSchlagschattenTrue
markerscaleMarkierungsgrößenmultiplikator1.5
labelspacingVertikaler Abstand zwischen Einträgen0.5
handlelengthLänge der Legendenlinie2.0

Praktische Beispiele

Legende für mehrere Plottypen

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(5)
values = [23, 45, 56, 78, 32]
trend = [20, 35, 50, 65, 40]
 
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(x, values, alpha=0.7, label='Ist-Werte', color='steelblue')
ax.plot(x, trend, 'ro-', label='Trend', linewidth=2)
ax.axhline(y=50, color='green', linestyle='--', label='Ziel')
 
ax.legend(loc='upper left')
ax.set_xlabel('Quartal')
ax.set_ylabel('Umsatz ($K)')
plt.show()

Separate Legenden für Doppelachsen

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(2020, 2027)
revenue = [100, 120, 115, 140, 160, 175, 200]
employees = [50, 55, 52, 60, 70, 75, 85]
 
fig, ax1 = plt.subplots(figsize=(8, 5))
line1 = ax1.plot(x, revenue, 'b-o', label='Umsatz ($M)')
ax1.set_ylabel('Umsatz ($M)', color='blue')
 
ax2 = ax1.twinx()
line2 = ax2.plot(x, employees, 'r-s', label='Mitarbeiter')
ax2.set_ylabel('Mitarbeiter', color='red')
 
# Legenden kombinieren
lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper left')
plt.show()

Interaktive Datenexploration

Beim Iterieren an Diagramm-Ästhetik und Legendenplatzierung ermöglicht PyGWalker (opens in a new tab) das Erstellen interaktiver Visualisierungen in Jupyter durch Ziehen von Spalten -- Legenden, Farben und Größen werden automatisch generiert:

import pandas as pd
import pygwalker as pyg
 
df = pd.read_csv('your_data.csv')
walker = pyg.walk(df)

Häufig gestellte Fragen

Wie füge ich einem Matplotlib-Plot eine Legende hinzu?

Fügen Sie label='name' zu jedem plot()-, scatter()- oder bar()-Aufruf hinzu und rufen Sie dann plt.legend() oder ax.legend() auf. Die Legende verwendet automatisch die von Ihnen bereitgestellten Labels.

Wie verschiebe ich die Legende außerhalb des Plots?

Verwenden Sie bbox_to_anchor mit loc. Für die rechte Seite: ax.legend(loc='center left', bbox_to_anchor=(1.0, 0.5)). Für unten: ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1)). Rufen Sie plt.tight_layout() auf, um Abschneiden zu verhindern.

Wie ändere ich die Schriftgröße der Legende in Matplotlib?

Übergeben Sie fontsize an legend(): ax.legend(fontsize=14) oder verwenden Sie String-Größen wie 'small', 'medium', 'large'. Für den Titel: ax.legend(title='Title', title_fontsize=16).

Wie erstelle ich eine Legende mit mehreren Spalten?

Verwenden Sie den ncol-Parameter: ax.legend(ncol=3) erstellt ein 3-Spalten-Layout. Dies ist nützlich, wenn Sie viele Legendeneinträge haben und ein kompaktes horizontales Layout wünschen.

Wie entferne ich den Legendenrahmen?

Setzen Sie frameon=False: ax.legend(frameon=False). Um den Rahmen beizubehalten, aber transparent zu machen, verwenden Sie framealpha=0: ax.legend(framealpha=0).

Fazit

Matplotlib-Legenden beginnen mit label-Parametern und plt.legend(). Verwenden Sie loc für Standardpositionen, bbox_to_anchor um die Legende außerhalb des Plots zu verschieben, ncol für mehrspaltige Layouts und Styling-Parameter wie fontsize, frameon und shadow für die Anpassung. Bei Plots mit vielen Serien platzieren Sie die Legende außerhalb des Achsenbereichs und rufen tight_layout() auf, um Abschneiden zu verhindern. Bei komplexen Abbildungen mit Doppelachsen kombinieren Sie Linien-Handles manuell, um eine einheitliche Legende zu erstellen.

📚