Matplotlib Subplots: Mehrfach-Panel-Figuren mit plt.subplots() erstellen
Updated on
Einzelne Diagramme reichen für echte Analysen selten aus. Sie müssen Verteilungen nebeneinander vergleichen, ein Streudiagramm neben seinen Residuen zeigen oder vier Metriken in einem Dashboard-Layout präsentieren. Ohne Subplots würden Sie separate Figuren erstellen, die ihre visuelle Beziehung verlieren, wenn sie zusammen präsentiert werden.
Matplotlibs plt.subplots()-Funktion erstellt Mehrfach-Panel-Figuren mit gemeinsamen Achsen, konsistenter Größe und flexiblen Layouts. Dieser Leitfaden deckt alles ab, von einfachen Gittern bis hin zu fortgeschrittenen asymmetrischen Layouts.
Grundlegende Subplots
Einzelne Reihe
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
axes[0].plot(x, np.sin(x))
axes[0].set_title('Sinus')
axes[1].plot(x, np.cos(x), color='orange')
axes[1].set_title('Kosinus')
axes[2].plot(x, np.tan(x), color='green')
axes[2].set_ylim(-5, 5)
axes[2].set_title('Tangens')
plt.tight_layout()
plt.show()Gitter-Layout
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
x = np.linspace(0, 10, 100)
axes[0, 0].plot(x, x, 'b-')
axes[0, 0].set_title('Linear')
axes[0, 1].plot(x, x**2, 'r-')
axes[0, 1].set_title('Quadratisch')
axes[1, 0].plot(x, np.sqrt(x), 'g-')
axes[1, 0].set_title('Quadratwurzel')
axes[1, 1].plot(x, np.log(x + 1), 'm-')
axes[1, 1].set_title('Logarithmisch')
plt.tight_layout()
plt.show()Gemeinsame Achsen
Gemeinsame Achsen gewährleisten konsistente Skalen für Vergleiche:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1.5, 1000)
# X-Achse teilen
fig, axes = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
axes[0].hist(data1, bins=30, color='steelblue', alpha=0.7)
axes[0].set_ylabel('Anzahl')
axes[0].set_title('Verteilung A')
axes[1].hist(data2, bins=30, color='coral', alpha=0.7)
axes[1].set_ylabel('Anzahl')
axes[1].set_xlabel('Wert')
axes[1].set_title('Verteilung B')
plt.tight_layout()
plt.show()import matplotlib.pyplot as plt
import numpy as np
# Beide X- und Y-Achsen teilen
fig, axes = plt.subplots(2, 3, figsize=(12, 8), sharex=True, sharey=True)
for i, ax in enumerate(axes.flat):
data = np.random.randn(100)
ax.hist(data, bins=20, color=f'C{i}', alpha=0.7)
ax.set_title(f'Stichprobe {i+1}')
plt.tight_layout()
plt.show()Abstände und Layout-Steuerung
tight_layout()
Passt die Abstände automatisch an, um Überlappungen zu vermeiden:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# ... Diagramme hinzufügen ...
plt.tight_layout() # Abstände automatisch korrigieren
plt.show()subplots_adjust()
Manuelle Steuerung der Abstände:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
plt.subplots_adjust(
left=0.1, # Linker Rand
right=0.95, # Rechter Rand
top=0.92, # Oberer Rand
bottom=0.08, # Unterer Rand
wspace=0.3, # Horizontaler Abstand zwischen Subplots
hspace=0.4, # Vertikaler Abstand zwischen Subplots
)
plt.show()Einen Supertitel hinzufügen
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
fig.suptitle('Trigonometrische Funktionen', fontsize=16, fontweight='bold')
x = np.linspace(0, 2 * np.pi, 100)
for ax, func, name in zip(axes, [np.sin, np.cos, np.tan], ['sin', 'cos', 'tan']):
ax.plot(x, func(x))
ax.set_title(name)
plt.tight_layout()
plt.show()GridSpec für asymmetrische Layouts
Wenn Sie Panels unterschiedlicher Größe benötigen, verwenden Sie GridSpec:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(2, 3, figure=fig)
# Großes linkes Panel (erstreckt sich über 2 Reihen)
ax1 = fig.add_subplot(gs[:, 0])
ax1.plot(np.random.randn(100).cumsum())
ax1.set_title('Zeitreihe (2 Reihen)')
# Obere rechte Panels
ax2 = fig.add_subplot(gs[0, 1])
ax2.bar(['A', 'B', 'C'], [3, 7, 5])
ax2.set_title('Balkendiagramm')
ax3 = fig.add_subplot(gs[0, 2])
ax3.scatter(np.random.randn(50), np.random.randn(50))
ax3.set_title('Streudiagramm')
# Unteres breites Panel (erstreckt sich über 2 Spalten)
ax4 = fig.add_subplot(gs[1, 1:])
ax4.hist(np.random.randn(500), bins=30, color='coral')
ax4.set_title('Histogramm (2 Spalten)')
plt.tight_layout()
plt.show()subplot2grid für positionsbasiertes Layout
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(12, 8))
# (Reihen, Spalten), (Reihe_Start, Spalte_Start), rowspan, colspan
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
ax2 = plt.subplot2grid((3, 3), (0, 2), rowspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0))
ax4 = plt.subplot2grid((3, 3), (1, 1))
ax5 = plt.subplot2grid((3, 3), (2, 0), colspan=3)
ax1.set_title('Oben Breit')
ax2.set_title('Rechts Hoch')
ax3.set_title('Mitte Links')
ax4.set_title('Mitte Zentrum')
ax5.set_title('Unten Volle Breite')
plt.tight_layout()
plt.show()Über Subplots iterieren
import matplotlib.pyplot as plt
import numpy as np
# Axes-Array für einfache Iteration abflachen
fig, axes = plt.subplots(2, 3, figsize=(12, 8))
datasets = [np.random.randn(100) for _ in range(6)]
colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6', '#1abc9c']
for ax, data, color, i in zip(axes.flat, datasets, colors, range(6)):
ax.hist(data, bins=20, color=color, alpha=0.7)
ax.set_title(f'Datensatz {i+1}')
ax.set_xlabel('Wert')
ax.set_ylabel('Anzahl')
plt.tight_layout()
plt.show()Leere Subplots entfernen
Wenn Sie weniger Diagramme als Gitterpositionen haben:
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 3, figsize=(12, 8))
data_count = 5 # Nur 5 Datensätze für 6 Plätze
for i, ax in enumerate(axes.flat):
if i < data_count:
ax.plot(np.random.randn(50).cumsum())
ax.set_title(f'Diagramm {i+1}')
else:
ax.set_visible(False) # Leeren Subplot verstecken
plt.tight_layout()
plt.show()Interaktive Mehrfach-Panel-Exploration
Für schnelle visuelle Exploration, bei der Sie verschiedene Ansichten desselben Datensatzes interaktiv vergleichen möchten, ermöglicht PyGWalker (opens in a new tab) das Erstellen von Dashboards durch Drag-and-Drop von Spalten in Jupyter -- kein Subplot-Code erforderlich:
import pandas as pd
import pygwalker as pyg
df = pd.read_csv('your_data.csv')
walker = pyg.walk(df)FAQ
Wie erstelle ich Subplots in Matplotlib?
Verwenden Sie fig, axes = plt.subplots(zeilen, spalten), um eine Figur mit einem Gitter von Subplots zu erstellen. Greifen Sie auf einzelne Achsen mit axes[zeile, spalte] für Gitter oder axes[i] für einzelne Zeilen/Spalten zu. Rufen Sie immer plt.tight_layout() am Ende auf, um überlappende Beschriftungen zu vermeiden.
Wie teile ich Achsen zwischen Subplots?
Übergeben Sie sharex=True oder sharey=True an plt.subplots(). Zum Beispiel macht fig, axes = plt.subplots(2, 1, sharex=True) beide Subplots mit derselben X-Achsenskala. Dies ist nützlich für den Vergleich von Verteilungen oder Zeitreihen.
Wie erstelle ich Subplots unterschiedlicher Größe?
Verwenden Sie matplotlib.gridspec.GridSpec für asymmetrische Layouts. Erstellen Sie ein Gitter und verwenden Sie Slice-Notation, um mehrere Zellen zu überspannen: ax = fig.add_subplot(gs[0, :2]) erstellt einen Subplot, der die ersten beiden Spalten der ersten Zeile überspannt.
Wie passe ich die Abstände zwischen Subplots an?
Rufen Sie plt.tight_layout() für automatische Abstände auf. Für manuelle Steuerung verwenden Sie plt.subplots_adjust(wspace=0.3, hspace=0.4), wobei wspace der horizontale und hspace der vertikale Abstand ist.
Wie füge ich einen Titel über allen Subplots hinzu?
Verwenden Sie fig.suptitle('Mein Titel', fontsize=16), um einen Supertitel über allen Subplots hinzuzufügen. Möglicherweise müssen Sie den oberen Rand mit plt.subplots_adjust(top=0.92) anpassen oder plt.tight_layout() aufrufen, um Überlappungen zu vermeiden.
Fazit
Matplotlibs plt.subplots() ist die Grundlage für Mehrfach-Panel-Figuren. Verwenden Sie es mit (zeilen, spalten) für reguläre Gitter, sharex/sharey für konsistente Skalen, tight_layout() für automatische Abstände und GridSpec für asymmetrische Layouts. Für schnelle Iteration flachen Sie das Axes-Array mit axes.flat ab und iterieren Sie. Diese Muster decken die überwiegende Mehrheit der Mehrfach-Panel-Visualisierungsanforderungen ab.