Positionierung der Legende außerhalb des Diagramms in Matplotlib
Updated on
Die Positionierung von Legenden in Datenvisualisierungen kann oft eine Herausforderung darstellen. Heute werden wir dieses Problem angehen und zeigen, wie man mithilfe der beliebten Datenvisualisierungsbibliothek Matplotlib eine Legende effektiv außerhalb eines Diagramms platzieren kann. Tauchen wir ein und stellen sicher, dass Ihre Legenden nie wieder Ihre Daten stören!
Verständnis des Problems
Die Legende eines Diagramms ist zwar ein wichtiges Element für die Datenauswertung, kann aber manchmal wertvollen Diagrammplatz einnehmen und zu überfüllten und weniger lesbaren Diagrammen führen. Eine beliebte Lösung für dieses Problem besteht darin, die Legende außerhalb des Diagrammbereichs zu verschieben.
Die Lösung mit Matplotlib
Matplotlib, eine robuste und vielseitige Python-Bibliothek für die Datenvisualisierung, bietet eine einfache Lösung, um die Legende außerhalb des Diagramms zu positionieren.
Um das Konzept zu veranschaulichen, erstellen wir zunächst ein einfaches Liniendiagramm mit der pyplot
-API von Matplotlib:
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()
Im obigen Code haben wir zwei Linienplots, die sin(x)
und cos(x)
darstellen. Der Aufruf der Funktion legend()
fügt dem Diagramm eine Legende innerhalb des Diagrammbereichs hinzu, wodurch oft Teile der Daten verdeckt werden.
Positionierung der Legende außerhalb des Diagramms
Um die Legende außerhalb des Diagramms zu verschieben, können wir den Parameter bbox_to_anchor
der Funktion legend()
verwenden. Mit diesem Parameter können wir die Position der Begrenzungsbox der Legende in Bezug auf die Achsen des Diagramms angeben.
Hier ist ein Beispiel, in dem wir die Legende rechts neben das Diagramm platzieren:
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()
In diesem Code platziert bbox_to_anchor=(1.05, 1)
die Begrenzungsbox der Legende direkt außerhalb der Achsen in der oberen linken Ecke. loc='upper left'
gibt den Punkt in der Legendenbox an, der an den in bbox_to_anchor
angegebenen Koordinaten platziert werden soll.
Anpassung der Legende
Über die grundlegende Positionierung hinaus können wir mehrere Anpassungen an der Legende vornehmen, um sie an unsere Bedürfnisse anzupassen.
Verringerung der Schriftgröße
Um die Schriftgröße des Legendentextes zu verringern:
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', prop={'size': 6})
plt.show()
In diesem Code reduziert prop={'size': 6}
die Schriftgröße des Legendentextes und macht die gesamte Legendenbox kleiner.
Ändern der Legendenorientierung
Wenn Sie eine horizontale Legende möchten, verwenden Sie den Parameter ncol
, um die Anzahl der Spalten anzugeben:
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(0.5, -0.15), loc='upper center', ncol=2)
plt.show()
Nehmen Sie die Kontrolle über die Platzierung Ihrer Matplotlib-Legende
Eine der wiederkehrenden Aufgaben in der Datenvisualisierung mit Python besteht darin, klare, prägnante und ansprechende Diagramme zu erstellen. Ein wesentlicher Teil davon besteht darin, die Legende außerhalb des Diagramms in Matplotlib richtig anzuordnen. Diese umfassende Anleitung zeigt Ihnen verschiedene Methoden, um genau das zu erreichen.
Bbox_to_anchor: Ihr Ticket zu einer besseren Platzierung der Legende
Es gibt zahlreiche Ansätze, um Ihre Legende außerhalb der Matplotlib-Diagrammbox zu positionieren. Eine der flexibelsten und effizientesten Methoden besteht darin, das Stichwortargument bbox_to_anchor
zu verwenden. Tauchen wir tiefer ein, wie Sie dieses leistungsstarke Feature nutzen können, um die Ästhetik Ihrer Diagramme zu verbessern.
Für eine grundlegende Anwendung von bbox_to_anchor
betrachten Sie das folgende Beispiel, bei dem die Legende leicht außerhalb der Achsengrenzen verschoben wird:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
ax.plot(x, i * x, label='$y = %ix$' % i)
ax.legend(bbox_to_anchor=(1.1, 1.05))
plt.show()
Im obigen Codebeispiel wird die Legende strategisch leicht rechts und oberhalb der oberen rechten Ecke der Achsengrenzen platziert, um sicherzustellen, dass sie das Diagramm nicht verdeckt, aber dennoch gut sichtbar bleibt.
Die Kraft des Schrumpfens nutzen: Ein weiterer Schlüssel zur optimalen Platzierung der Legende
In Szenarien, in denen Sie die Legende weiter außerhalb des Diagramms platzieren möchten, können Sie das aktuelle Diagrammformat verkleinern. Schauen wir uns ein Codebeispiel an:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
ax.plot(x, i * x, label='$y = %ix$'%i)
# Aktuelle Achse um 20% verkleinern
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
# Legende rechts von der aktuellen Achse platzieren
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()
Mit diesem Ansatz können wir einen Teil des Diagrammbereichs dazu verwenden, die Legende bequem unterzubringen. Beachten Sie, wie wir ax.get_position()
verwendet haben, um die aktuelle Position der Achsen abzurufen, sie entsprechend anzupassen und dann die Legende neu zu positionieren.
Legende am unteren Rand des Diagramms platzieren
Wenn das Platzieren der Legende rechts neben dem Diagramm nicht geeignet ist, besteht auch die Möglichkeit, sie unterhalb des Diagramms zu positionieren. Hier ist ein Beispiel:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
line, = ax.plot(x, i * x, label='$y = %ix$'%i)
# Aktuelle Höhe der Achse um 10% unten verkleinern
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
box.width, box.height * 0.9])
# Legende unterhalb der aktuellen Achse platzieren
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
fancybox=True, shadow=True, ncol=5)
plt.show()
Mit diesem Ansatz lässt sich der verfügbare Platz effektiv nutzen, ohne die Sicht auf das Diagramm zu behindern.
Die Legende der Legenden: Matplotlib Legendenführer
Für angehende Data Scientists oder erfahrene Profis ist es wichtig, zu wissen, wie man die Platzierung der Legende in Matplotlib-Plots kontrolliert. Nachdem wir bereits mehrere Methoden behandelt haben, um die Legende außerhalb des Diagramms zu positionieren, wollen wir uns nun mit einigen erweiterten Anpassungsmöglichkeiten befassen.
Feinabstimmung des Legendenstils
Manchmal möchten wir unsere Legende noch besser lesbar und ästhetisch ansprechend gestalten. Mit den Parametern fancybox
, shadow
und borderpad
sind verschiedene Gestaltungsoptionen möglich:
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
fancybox=True, shadow=True, borderpad=1.5, ncol=5)
In diesem Beispiel verleiht fancybox=True
der Legendenbox abgerundete Ecken, shadow=True
erzeugt einen Schatteneffekt und borderpad=1.5
erhöht den Abstand innerhalb der Box.
Reihenfolge der Legenden-Einträge ändern
In einigen Fällen möchten Sie möglicherweise die Reihenfolge der Einträge in Ihrer Legende ändern. Die Klasse HandlerLine2D
in Matplotlib kann Ihnen dabei helfen. Hier eine einfache Illustration:
from matplotlib.lines import Line2D
fig, ax = plt.subplots()
lines = []
labels = []
for i in range(5):
line, = ax.plot(x, i * x, label='$y = %ix$' % i)
lines.append(line)
labels.append('$y = %ix$' % i)
# Labels und Linien-Handles neu anordnen
lines = [lines[i] for i in [4, 2, 0, 1, 3]]
labels = [labels[i] for i in [4, 2, 0, 1, 3]]
# Legende für die erste Linie erstellen
first_legend = plt.legend(lines[:2], labels[:2], loc='upper left')
# Legende manuell zum aktuellen Plot hinzufügen
ax.add_artist(first_legend)
# Eine weitere Legende für den Rest erstellen.
plt.legend(lines[2:], labels[2:], loc='lower right')
plt.show()
In diesem Szenario werden zunächst die Linien gezeichnet, ihre Handles und Labels gespeichert und dann nach unseren individuellen Vorlieben neu angeordnet.
Alternative zu Matplotlib: Datenvisualisierung mit PyGWalker
Neben der Verwendung von Matplotlib zur Visualisierung Ihrer Pandas-Datenrahmen gibt es eine alternative, Open Source Python-Bibliothek, die Ihnen die Erstellung von Datenvisualisierungen erleichtern kann: PyGWalker (opens in a new tab).
Sie müssen keine komplizierten Python-Codierung mehr durchführen. Importieren Sie einfach Ihre Daten und ziehen Sie Variablen, um verschiedenste Datenvisualisierungen zu erstellen! Hier ist ein kurzes Demo-Video zur Bedienung:
So verwenden Sie PyGWalker in Ihrem Jupyter Notebook:
pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)
Alternativ können Sie es auch in Kaggle Notebook/Google Colab ausprobieren:
PyGWalker basiert auf der Unterstützung unserer Open Source Community. Vergessen Sie nicht, PyGWalker auf GitHub (opens in a new tab) zu besuchen und uns ein Sternchen zu geben!
Fazit
Das Verständnis der verschiedenen Anpassungsmöglichkeiten der Matplotlib-Legende ist entscheidend für die Erstellung professioneller Diagramme. Üben Sie daher diese Techniken und erkunden Sie die Matplotlib-Dokumentation, um sich in diesem unverzichtbaren Werkzeug für die Datenvisualisierung zu perfektionieren.
Häufig gestellte Fragen
Im Folgenden werden häufig gestellte Fragen zur Platzierung der Legende in Matplotlib beantwortet.
F1: Kann ich die Matplotlib-Legende außerhalb des Diagrammbereichs platzieren, ohne das Diagramm selbst zu verändern?
Ja, Sie können die Legende außerhalb des Plots platzieren, ohne den Plot selbst zu verändern. Die Legende ist jedoch möglicherweise nicht in der gespeicherten Abbildung sichtbar, da die Option bbox_inches='tight'
in plt.savefig()
die Elemente außerhalb der Achsgrenzen nicht berücksichtigt.
F2: Gibt es eine Möglichkeit, den besten Ort für die Legende automatisch zu ermitteln?
Ja, Matplotlib bietet eine Möglichkeit, den besten Ort für die Legende automatisch zu ermitteln, indem Sie loc='best'
an die legend()
-Funktion übergeben. Diese Funktion platziert die Legende an der Stelle, an der sie sich am wenigsten mit dem Diagramm überschneidet.
F3: Wie kann ich die Lesbarkeit der Legendenbeschriftungen verbessern, wenn sie sich mit dem Diagramm überlappen?
Sie können die Lesbarkeit der Legendenbeschriftungen verbessern, indem Sie einen halbtransparenten Hintergrund für die Legende verwenden. Dies kann erreicht werden, indem Sie den Parameter framealpha
in legend()
setzen. Zum Beispiel setzt ax.legend(framealpha=0.5)
den Hintergrund der Legende halbtransparent.