HOWTO · Matplotlib

Eine Matplotlib-Legende außerhalb der Achsen platzieren

So platzieren Sie eine Matplotlib-Legende außerhalb der Achsen und sorgen dafür, dass sie in gespeicherten Abbildungen sichtbar bleibt.

Auf dieser Seite

Mit bbox_to_anchor und loc lässt sich eine Matplotlib-Legende außerhalb der Achsen positionieren. Zum Beispiel verankert ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) die linke obere Ecke der Legende knapp außerhalb der rechten oberen Kante der Achsen. Im standardmäßigen Achsenkoordinatensystem liegt (0, 0) links unten und (1, 1) rechts oben.

bbox_to_anchor-Beispiel

Mit einem bbox_to_anchor-Paar aus zwei Werten platzieren Sie die Legende knapp außerhalb der Achsen. Bei Axes.legend ist dieses Paar ein Ankerpunkt in Achsenkoordinaten; loc richtet die entsprechende Ecke der Legende an diesem Punkt aus. Das vollständige Beispiel zeichnet zwei beschriftete Kurven und lässt in der Abbildung Platz für die Legende.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
fig.subplots_adjust(right=0.78)
plt.close(fig)

Matplotlib-Legende: Beispiel mit bbox_to_anchor

Für eine genauere Positionierung akzeptiert bbox_to_anchor auch das Tupel (x0, y0, width, height). Damit legen Sie einen Ankerrahmen fest, nicht die Abmessungen der Legende: (x0, y0) bezeichnet dessen linke untere Ecke; width und height bestimmen die Größe des Rahmens in Achsenkoordinaten. loc legt fest, welcher Punkt der Legende am entsprechenden Punkt dieses Rahmens ausgerichtet wird. Bei loc="upper left" liegt zum Beispiel die linke obere Ecke der Legende an der linken oberen Ecke des Rahmens. Zu den gebräuchlichen Zeichenkettenwerten gehören "upper right", "lower left", "center" und "best". Matplotlib akzeptiert auch die zugehörigen Zahlencodes: 0 steht für "best", 10 für "center".

tight_layout() passt die Parameter der Teilabbildungen an, damit Beschriftungen, Titel und andere Achsenverzierungen Platz haben. Für eine außerhalb platzierte Legende reserviert es jedoch nicht in jedem Layout zuverlässig Platz. Damit die Legende in einem Fenster sichtbar bleibt, können Sie mit fig.subplots_adjust(right=...) Platz freihalten oder ein Layout wählen, das sowohl Achsen als auch Legende berücksichtigt. Das erste Bild zeigt eine Legende außerhalb der Achsen; das Bild des abgeschnittenen Ergebnisses veranschaulicht, was passieren kann, wenn die Abbildung dafür keinen Platz lässt.

Matplotlib-Legende: abgeschnittenes Ergebnis mit bbox_to_anchor

bbox_extra_artists und bbox_inches: Abschneiden der Legende verhindern

Übergeben Sie beim Speichern einer Abbildung die außerhalb liegende Legende in bbox_extra_artists und setzen Sie bbox_inches="tight". Beim Berechnen des engen Begrenzungsrahmens berücksichtigt der Speichervorgang dann auch die Legende, sodass sie im exportierten Bild enthalten ist. Das Beispiel wurde erfolgreich ausgeführt und speichert die PNG-Datei in einem temporären Verzeichnis. Es erzeugt weder eine Standardausgabe noch eine Fehlerausgabe.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory

x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
legend = ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))

with TemporaryDirectory() as directory:
    output_path = Path(directory) / "example.png"
    fig.savefig(
        output_path,
        dpi=300,
        format="png",
        bbox_extra_artists=(legend,),
        bbox_inches="tight",
    )

plt.close(fig)

bbox_extra_artists nimmt Künstlerobjekte entgegen, die Matplotlib bei der Berechnung des engen Begrenzungsrahmens berücksichtigen soll. Mit bbox_inches="tight" weist savefig Matplotlib an, den so berechneten Rahmen für das gespeicherte Bild zu verwenden. Diese Optionen verhindern, dass die Legende beim Export abgeschnitten wird; sie ändern weder ihre Position innerhalb der Achsen noch ihre Größe.

Das Speicherbeispiel wurde mit Exit-Code 0 ausgeführt. Standardausgabe und Fehlerausgabe waren leer, daher gibt es keine sichtbare Ausgabe.