Erstellung von Matplotlib-Subplots

MatplotlibBeginner
Jetzt üben

Einführung

In der Datenvisualisierung ist es oft nützlich, mehrere Plots in einer einzigen Abbildung anzuzeigen. Dies ermöglicht einen einfachen Vergleich zwischen verschiedenen Datensätzen oder verschiedenen Ansichten derselben Daten. Matplotlib bietet eine leistungsstarke und bequeme Möglichkeit, solche Abbildungen mithilfe von Subplots zu erstellen.

Der gebräuchlichste Weg, Subplots zu erstellen, ist die Funktion plt.subplots(). Diese Funktion erstellt in einem einzigen Aufruf eine Abbildung und ein Gitter von Subplots und gibt ein Figure-Objekt und ein Array von Axes-Objekten zurück, die jeden einzelnen Subplot darstellen.

In diesem Lab lernen Sie, wie Sie:

  • Eine Abbildung mit mehreren Subplots erstellen.
  • Daten auf spezifische Subplots zeichnen.
  • Das Layout anpassen, um Überlappungen von Plots zu vermeiden.
  • Achsen zwischen Subplots teilen, um klarere Vergleiche zu ermöglichen.

Sie werden Python-Skripte in der WebIDE schreiben und ausführen. Da diese Umgebung keine interaktiven GUI-Fenster unterstützt, speichern Sie Ihre Plots als Bilddateien und betrachten sie direkt im Editor.

Abbildung und Achsen mit plt.subplots() erstellen

In diesem Schritt beginnen Sie mit der Erstellung einer Abbildung, die zwei leere Subplots enthält, die in einer Zeile und zwei Spalten angeordnet sind. Dies ist der grundlegende Schritt zum Erstellen von Visualisierungen mit mehreren Plots.

Wir werden die Funktion plt.subplots() verwenden. Wenn Sie plt.subplots(nrows, ncols) aufrufen, gibt diese zwei Elemente zurück:

  1. Ein Figure-Objekt, das das gesamte Fenster oder die Seite ist, auf der alles gezeichnet wird. Wir weisen es normalerweise einer Variablen namens fig zu.
  2. Ein Array von Axes-Objekten. Jedes Axes-Objekt repräsentiert einen der Subplots im Gitter. Sie können darauf über ihren Index zugreifen. Für ein (1, 2)-Gitter können wir dieses Array in zwei Variablen entpacken: ax1 und ax2.

Schreiben wir den Code. Öffnen Sie die Datei main.py aus dem Dateiexplorer auf der linken Seite und fügen Sie den folgenden Inhalt hinzu. Dieses Skript importiert die notwendigen Bibliotheken, erstellt eine Abbildung mit zwei Subplots und speichert sie als Bilddatei namens plot1.png.

import matplotlib.pyplot as plt
import numpy as np

## Erstellt eine Abbildung und einen Satz von Subplots.
## 1 Zeile, 2 Spalten.
fig, (ax1, ax2) = plt.subplots(1, 2)

## Speichert die Abbildung in einer Datei.
## Die Datei wird im Verzeichnis /home/labex/project erstellt.
plt.savefig('plot1.png')

print("Figure saved as plot1.png")

Führen Sie nun das Skript im Terminal aus, um den Plot zu generieren.

python3 main.py

Sie sollten die folgende Ausgabe in Ihrem Terminal sehen:

Figure saved as plot1.png

Eine neue Datei namens plot1.png wird im Dateiexplorer erscheinen. Doppelklicken Sie darauf, um Ihre erste Abbildung mit zwei leeren Subplots anzuzeigen.

Plot1

Plotten auf dem ersten Subplot mit ax1.plot()

In diesem Schritt lernen Sie, wie Sie einen Plot auf einem der spezifischen Axes-Objekte zeichnen, die Sie erstellt haben. Jedes Axes-Objekt hat seine eigenen Plot-Methoden wie plot(), bar(), scatter() usw., die den Funktionen in der Hauptschnittstelle plt ähneln.

Wir werden eine einfache Sinuswelle auf dem ersten Subplot zeichnen, der durch die Variable ax1 repräsentiert wird. Wir werden diesem Subplot auch einen Titel mit der Methode set_title() hinzufügen.

Aktualisieren Sie Ihre main.py-Datei mit dem folgenden Code. Wir fügen die Datengenerierung mit NumPy hinzu und plotten diese dann auf ax1.

import matplotlib.pyplot as plt
import numpy as np

## Erstellt einige Daten
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

## Erstellt eine Abbildung und einen Satz von Subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plotten auf dem ersten Subplot (ax1)
ax1.plot(x, y)
ax1.set_title('Sine Wave')

## Speichert die Abbildung in einer neuen Datei
plt.savefig('plot2.png')

print("Figure saved as plot2.png")

Führen Sie nun das aktualisierte Skript im Terminal aus.

python3 main.py

Sie werden diese Ausgabe sehen:

Figure saved as plot2.png

Eine neue Datei namens plot2.png befindet sich nun in Ihrem Projektverzeichnis. Öffnen Sie sie, um das Ergebnis zu sehen. Der linke Subplot sollte nun einen Sinuswellen-Plot enthalten, während der rechte leer bleibt.

Plot2

Plotten auf dem zweiten Subplot mit ax2.plot()

In diesem Schritt vervollständigen Sie die Abbildung, indem Sie einen Plot auf dem zweiten Subplot hinzufügen. Der Prozess ist identisch mit dem vorherigen Schritt, aber diesmal rufen Sie die Methode plot() auf dem ax2-Objekt auf.

Wir werden eine Kosinuswelle auf dem zweiten Subplot zeichnen, um sie mit der Sinuswelle zu vergleichen. Wir werden ihr auch einen Titel geben.

Ändern Sie Ihre main.py-Datei, um das Plotten auf der zweiten Achse einzuschließen.

import matplotlib.pyplot as plt
import numpy as np

## Erstellt einige Daten
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Erstellt eine Abbildung und einen Satz von Subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plotten auf dem ersten Subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plotten auf dem zweiten Subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Speichert die Abbildung in einer neuen Datei
plt.savefig('plot3.png')

print("Figure saved as plot3.png")

Im obigen Code haben wir 'tab:orange' zum ax2.plot()-Aufruf hinzugefügt, um die Linienfarbe zu ändern und die Plots visuell zu unterscheiden.

Führen Sie das Skript erneut im Terminal aus.

python3 main.py

Die Ausgabe wird sein:

Figure saved as plot3.png

Öffnen Sie nun plot3.png. Sie sehen eine vollständige Abbildung mit zwei Plots nebeneinander. Möglicherweise stellen Sie jedoch fest, dass die Titel oder Achsenbeschriftungen etwas gedrängt sind. Das beheben wir im nächsten Schritt.

Plot3

Anpassen des Subplot-Layouts mit plt.tight_layout()

In diesem Schritt lernen Sie, wie Sie den Abstand zwischen Subplots automatisch anpassen, um zu verhindern, dass Titel und Beschriftungen überlappen. Matplotlib bietet dafür eine einfache Funktion: plt.tight_layout().

Diese Funktion untersucht die Bounding Boxes aller Künstler (Künstler sind alle Elemente, die auf der Abbildung gezeichnet werden, wie Titel, Beschriftungen und die Plots selbst) und passt die Subplot-Parameter so an, dass alles ordentlich und ohne Überlappungen passt. Es ist eine gute Praxis, sie direkt vor dem Speichern oder Anzeigen Ihres Plots aufzurufen.

Fügen wir plt.tight_layout() zu unserem Skript hinzu. Aktualisieren Sie main.py wie folgt:

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Adjust layout to prevent overlap
plt.tight_layout()

## Save the figure to a new file
plt.savefig('plot4.png')

print("Figure saved as plot4.png")

Die einzige Änderung ist die Hinzufügung der Zeile plt.tight_layout(). Führen Sie nun das Skript aus.

python3 main.py

Ausgabe:

Figure saved as plot4.png

Öffnen Sie plot4.png und vergleichen Sie es mit plot3.png. Sie sollten feststellen, dass der Abstand zwischen den beiden Subplots optimiert wurde, was zu einer saubereren und professioneller aussehenden Abbildung führt.

Plot4

Achsen teilen mit sharex=True oder sharey=True

In diesem Schritt lernen Sie, wie Sie Subplots erstellen, die eine gemeinsame Achse teilen. Dies ist besonders nützlich, wenn Sie Datensätze vergleichen, die die gleiche x- oder y-Skala haben. Wenn Achsen geteilt werden, aktualisiert das Zoomen oder Verschieben auf einem Subplot automatisch den anderen. Es hilft auch, die Abbildung aufzuräumen, indem redundante Tick-Beschriftungen entfernt werden.

Sie können die Achsenfreigabe aktivieren, indem Sie die Argumente sharex=True oder sharey=True an plt.subplots() übergeben.

Um dies zu demonstrieren, erstellen wir ein neues Skript. Erstellen Sie eine Datei namens shared_axes.py in Ihrem Projektverzeichnis und fügen Sie den folgenden Code hinzu. Dieses Beispiel erstellt zwei Subplots, die vertikal gestapelt sind (nrows=2, ncols=1) und sich die x-Achse teilen.

import matplotlib.pyplot as plt
import numpy as np

## Create data
t = np.arange(0.01, 5.0, 0.01)
s1 = np.exp(t)
s2 = np.sin(2 * np.pi * t)

## Create a figure and two subplots that share the x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

## Plot on the first subplot
ax1.plot(t, s1, 'tab:blue')
ax1.set_ylabel('Exponential')

## Plot on the second subplot
ax2.plot(t, s2, 'tab:orange')
ax2.set_ylabel('Sinusoidal')
ax2.set_xlabel('time (s)')

## Adjust layout
plt.tight_layout()

## Save the figure
plt.savefig('plot5.png')

print("Figure saved as plot5.png")

Die einzige Änderung ist die Hinzufügung der Zeile plt.tight_layout(). Führen Sie nun dieses neue Skript vom Terminal aus.

python3 shared_axes.py

Ausgabe:

Figure saved as plot5.png

Öffnen Sie plot5.png. Beachten Sie, dass die x-Achsen-Tick-Beschriftungen nur auf dem unteren Subplot (ax2) vorhanden sind. Dies liegt daran, dass sharex=True automatisch die inneren x-Achsen-Beschriftungen ausblendet, um ein saubereres Erscheinungsbild zu erzielen. Beide Plots sind perfekt entlang der x-Achse ausgerichtet, was den Vergleich erleichtert.

Plot5

Zusammenfassung

Herzlichen Glückwunsch zum Abschluss des Labs! Sie haben die wesentlichen Techniken für die Erstellung und Verwaltung von Subplots in Matplotlib gelernt.

In diesem Lab haben Sie geübt:

  • Verwendung von plt.subplots(), um eine Abbildung mit einem Raster von Subplots zu erstellen.
  • Zugriff auf einzelne Axes-Objekte und deren Methoden zum Plotten von Daten.
  • Hinzufügen von Titeln zu spezifischen Subplots.
  • Verwendung von plt.tight_layout(), um den Abstand automatisch anzupassen und überlappende Elemente zu verhindern.
  • Erstellung von Subplots mit gemeinsamen Achsen unter Verwendung von sharex=True für einen klareren Datenvergleich und eine sauberere Abbildung.

Diese Fähigkeiten sind grundlegend für die Erstellung komplexer und informativer Datenvisualisierungen. Sie können nun Abbildungen erstellen, die mehrere Datensätze effektiv in einer einzigen, kohärenten Ansicht vergleichen.