HOWTO · Matplotlib
Hinzufügen von Subplot zu einer Abbildung in Matplotlib
In diesem Tutorial erfahren Sie, wie Sie mit `Figure.add_subplot()` Subplots zu einem bestehenden Matplotlib-Figure hinzufügen und positionieren oder mit `matplotlib.pyplot.subplots()` ein neues Figure samt Subplots erstellen.
Auf dieser Seite
Um einem bestehenden Matplotlib-Figure einen Subplot hinzuzufügen, rufen Sie Figure.add_subplot() mit der Zeilenanzahl, der Spaltenanzahl und der bei 1 beginnenden Position des Subplots im Raster auf. Das zurückgegebene Axes-Objekt dient zum Zeichnen und Festlegen der Beschriftungen. Mit matplotlib.pyplot.subplots() erstellen Sie dagegen ein neues Figure zusammen mit seinen Axes.
Führen Sie dieses Beispiel aus:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(5, 4))
ax = fig.add_subplot(1, 1, 1)
ax.plot([1, 2, 3, 4], [2, 5, 3, 7], marker="o")
ax.set(title="Measurements", xlabel="Sample", ylabel="Value")
print(f"axes={len(fig.axes)}")
plt.show()
axes=1
Das Figure enthält die Axes; auf dem Axes-Objekt liegen die gezeichnete Linie und ihre Beschriftungen. Die im Beispiel angezeigten Beschriftungen „Measurements“, „Sample“ und „Value“ bleiben im unveränderten Code auf Englisch. Wenn Ihr Skript ohne grafische Anzeige läuft, ersetzen Sie plt.show() durch fig.savefig("plot.png"), um das Figure stattdessen zu speichern.
Subplots mit Figure.add_subplot() zu einem Figure hinzufügen
Der Aufruf fig.add_subplot(nrows, ncols, index) unterteilt das Figure in ein Raster und platziert einen Subplot an der Position index. Die Zeilen werden von oben nach unten und die Spalten von links nach rechts gezählt. index beginnt bei 1 in der Zelle oben links. Bei einem Raster mit zwei Zeilen und zwei Spalten liegen die Positionen 1 und 2 in der oberen Zeile und die Positionen 3 und 4 in der unteren Zeile. Die Position bezeichnet eine Rasterzelle, keine Zeilennummer.
Bei einem Raster mit einer Zeile und einer Spalte wählen fig.add_subplot(1, 1, 1) und die Kurzform fig.add_subplot(111) dieselbe Zelle aus. In der kompakten dreistelligen Schreibweise stehen die einzelnen Ziffern für Zeilenanzahl, Spaltenanzahl und Position. Verwenden Sie sie daher nur, wenn alle drei Werte zwischen 1 und 9 liegen. Ist einer der Werte größer als 9, rufen Sie fig.add_subplot(nrows, ncols, index) mit drei getrennten Argumenten auf. Diese Form ist außerdem leichter zu verstehen, wenn das Raster oder die Position nicht auf den ersten Blick klar ist.
Für ein unregelmäßiges Layout können Sie für verschiedene Axes unterschiedliche Rasterangaben verwenden. Im folgenden Beispiel erstreckt sich das erste Axes über die gesamte Höhe eines Rasters mit zwei Spalten. Die beiden anderen belegen die Zellen oben rechts und unten rechts. Jeder Aufruf gibt das Axes-Objekt für die jeweilige Position zurück. Speichern Sie diese Objekte und rufen Sie die Plotmethoden darauf auf.
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 5))
left = fig.add_subplot(2, 2, (1, 3))
top_right = fig.add_subplot(2, 2, 2)
bottom_right = fig.add_subplot(2, 2, 4)
left.plot([1, 2, 3], [2, 4, 3])
left.set_title("Full-height axes")
top_right.plot([1, 2, 3], [1, 3, 2])
top_right.set_title("Top right")
bottom_right.plot([1, 2, 3], [3, 2, 4])
bottom_right.set_title("Bottom right")
fig.tight_layout()
plt.show()
Das Tupel (1, 3) wählt in der ersten Spalte einen Bereich aus Rasterzellen aus. Mit tight_layout() lassen sich Überlappungen zwischen Titeln und Achsendekorationen verringern. Je nach Größe des Figures und den Beschriftungen müssen Sie möglicherweise auch die Abmessungen oder Abstände anpassen. Da jedes Axes unabhängig ist, können Sie Titel, Beschriftungen, Teilstriche und geplottete Daten jeweils separat festlegen.
Ein Figure mit Subplots über matplotlib.pyplot.subplots() erstellen
Mit matplotlib.pyplot.subplots() erstellen Sie in einem Aufruf ein neues Figure und ein Raster aus Axes. Zurückgegeben wird ein Paar aus dem Figure und dem Axes-Objekt oder einem Array von Axes. Bei mehreren Subplots gibt squeeze=True (die Standardeinstellung) ein NumPy-Array zurück, dessen Dimensionen dem Raster entsprechen. Bei einem Raster mit zwei Zeilen und einer Spalte greifen Sie mit axes[0] und axes[1] auf das obere und das untere Axes zu. Bei nur einem Subplot ist das zurückgegebene Objekt ein einzelnes Axes und kein Array. Setzen Sie squeeze=False, wenn Sie immer ein zweidimensionales Array benötigen.
Das ist praktisch, wenn das Raster im Voraus feststeht und Sie beide Objekte sofort benötigen. Anders als Figure.add_subplot() erstellt diese Funktion ein neues Figure, statt Axes zu einem bereits vorhandenen Figure hinzuzufügen. Zeichnen Sie jede Datenreihe auf ihrem eigenen Axes und verwenden Sie tight_layout(), damit genügend Platz für Beschriftungen bleibt.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
fig, axes = plt.subplots(2, 1, figsize=(6, 5))
axes[0].plot(x, [value ** 2 for value in x], marker="o")
axes[0].set(title="Squared values", xlabel="x", ylabel="x squared")
axes[1].plot(x, [4 * value + 1 for value in x], marker="s")
axes[1].set(title="Linear values", xlabel="x", ylabel="4x + 1")
fig.tight_layout()
plt.show()
Das Ergebnis ist ein Figure mit zwei vertikal übereinander angeordneten Axes: Das obere zeigt die quadrierten Werte, das untere die linearen Werte. Behalten Sie das Figure in fig, wenn Sie einen Titel für das gesamte Figure festlegen, das vollständige Ergebnis speichern oder das Layout anpassen möchten. Für Formatierung und Darstellung einzelner Subplots verwenden Sie die jeweiligen Einträge in axes.