W3docs

Python Matplotlib Plotting: Ein umfassender Leitfaden

Liniendiagramme, Balkendiagramme, Kreisdiagramme, Streudiagramme und Subplots in Python mit Matplotlib erstellen und anpassen – mit klaren Beispielen.

Matplotlib ist die am weitesten verbreitete Datenvisualisierungsbibliothek in Python. Dieser Leitfaden erklärt, wie man die gängigsten Diagrammtypen erstellt — Liniendiagramme, Balkendiagramme, Kreisdiagramme, Streudiagramme und Subplots — und wie man sie mit Beschriftungen, Farben, Legenden und Layout-Einstellungen anpasst. Es wird vorausgesetzt, dass Sie Matplotlib bereits installiert haben und Python-Skripte lokal ausführen können.

Was ist Matplotlib Plotting?

Das pyplot-Modul von Matplotlib bietet eine MATLAB-ähnliche Schnittstelle, mit der Sie Diagramme Schritt für Schritt aufbauen können: eine Figure erstellen, Daten hinzufügen, Beschriftungen hinzufügen und das Ergebnis anzeigen oder speichern. Jedes Diagramm folgt demselben Muster:

  1. matplotlib.pyplot importieren (üblicherweise als plt).
  2. Eine Plotting-Funktion aufrufen (plt.plot(), plt.bar() usw.) mit Ihren Daten.
  3. Decorator-Funktionen aufrufen, um Titel, Achsenbeschriftungen, Legenden und so weiter hinzuzufügen.
  4. plt.show() aufrufen, um die Figure anzuzeigen, oder plt.savefig(), um sie auf die Festplatte zu schreiben.

Das Verstehen dieser Abfolge erleichtert den Wechsel zwischen Diagrammtypen und deren Kombination zu komplexeren Figuren.

Matplotlib installieren

Falls Sie Matplotlib noch nicht installiert haben, führen Sie folgenden Befehl in Ihrem Terminal aus:

pip install matplotlib

Überprüfen Sie die Installation, indem Sie es importieren:

import matplotlib
print(matplotlib.__version__)  # e.g. 3.9.0

Ein Liniendiagramm erstellen

Ein Liniendiagramm ist der Standard-Diagrammtyp und eignet sich ideal zur Darstellung von Trends über die Zeit oder einer geordneten Folge.

import matplotlib.pyplot as plt

# Data
years = [2015, 2016, 2017, 2018, 2019, 2020]
sales = [100, 150, 200, 250, 300, 350]

# Plot
plt.plot(years, sales)

# Labels and title
plt.xlabel("Year")
plt.ylabel("Sales (units)")
plt.title("Annual Sales")

plt.show()

plt.plot(x, y) zeichnet eine durchgehende Linie, die jedes (x, y)-Paar verbindet. Die x-Achse zeigt die Jahre und die y-Achse die Verkaufszahlen, wodurch der Aufwärtstrend auf einen Blick erkennbar wird.

Mehrere Linien plotten

Um zwei Datensätze auf denselben Achsen zu vergleichen, rufen Sie plt.plot() zweimal vor plt.show() auf. Verwenden Sie den Parameter label und plt.legend(), um jede Linie zu kennzeichnen:

import matplotlib.pyplot as plt

years = [2018, 2019, 2020, 2021, 2022]
product_a = [120, 145, 170, 210, 260]
product_b = [90, 115, 140, 165, 195]

plt.plot(years, product_a, label="Product A")
plt.plot(years, product_b, label="Product B")

plt.xlabel("Year")
plt.ylabel("Revenue ($k)")
plt.title("Revenue by Product")
plt.legend()

plt.show()

Matplotlib weist jeder Datenreihe automatisch unterschiedliche Farben zu. Der Aufruf von plt.legend() fügt einen Schlüssel hinzu, der Farben den Beschriftungen zuordnet.

Ein Balkendiagramm erstellen

Balkendiagramme vergleichen diskrete Kategorien. Verwenden Sie plt.bar() für vertikale Balken und plt.barh() für horizontale Balken.

import matplotlib.pyplot as plt

countries = ["USA", "China", "Japan", "Germany", "UK"]
gdp = [21.44, 14.14, 5.15, 4.17, 2.62]

plt.bar(countries, gdp, color="steelblue")

plt.xlabel("Country")
plt.ylabel("GDP (USD trillions)")
plt.title("Top 5 Economies by GDP")

plt.show()

Die Höhe jedes Balkens repräsentiert den BIP-Wert. Der Parameter color akzeptiert jeden benannten CSS-Farbnamen, einen Hex-String oder ein RGB-Tupel.

Gruppierte Balkendiagramme

Wenn Sie mehrere Kategorien nebeneinander vergleichen möchten, verschieben Sie die Balkenpositionen manuell mit range() und einem Breitenversatz:

import matplotlib.pyplot as plt

categories = ["Q1", "Q2", "Q3", "Q4"]
team_a = [30, 45, 38, 52]
team_b = [25, 40, 35, 48]

x = range(len(categories))
width = 0.35

plt.bar([i - width / 2 for i in x], team_a, width=width, label="Team A")
plt.bar([i + width / 2 for i in x], team_b, width=width, label="Team B")

plt.xticks(x, categories)
plt.xlabel("Quarter")
plt.ylabel("Sales")
plt.title("Quarterly Sales by Team")
plt.legend()

plt.show()

plt.xticks(x, categories) ersetzt die numerischen Tick-Positionen durch die tatsächlichen Quartalsnamen.

Ein Kreisdiagramm erstellen

Kreisdiagramme zeigen, wie Teile ein Ganzes bilden. Verwenden Sie sie sparsam — sie eignen sich am besten für fünf oder weniger Segmente, die zusammen 100 % ergeben.

import matplotlib.pyplot as plt

brands = ["Samsung", "Apple", "Huawei", "Xiaomi", "Others"]
market_share = [19.2, 15.9, 14.6, 10.2, 40.1]

plt.pie(
    market_share,
    labels=brands,
    autopct="%1.1f%%",   # show percentage inside each slice
    startangle=90,       # rotate so the first slice starts at the top
)

plt.title("Smartphone Market Share")

plt.show()
  • autopct="%1.1f%%" druckt den Prozentwert auf eine Dezimalstelle in jedem Segment.
  • startangle=90 dreht das Diagramm so, dass das erste Segment bei 12 Uhr beginnt, was die Lesbarkeit verbessert.

Hinweis: Die oben genannten Marktanteilszahlen sind Näherungswerte und dienen hier nur zur Veranschaulichung.

Ein Streudiagramm erstellen

Streudiagramme zeigen die Beziehung zwischen zwei kontinuierlichen Variablen. Jeder Punkt repräsentiert eine Beobachtung.

import matplotlib.pyplot as plt

hours_studied = [1, 2, 3, 4, 5, 6, 7, 8]
exam_scores   = [45, 52, 60, 65, 72, 78, 85, 90]

plt.scatter(hours_studied, exam_scores, color="coral", edgecolors="black", s=80)

plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Study Time vs. Exam Score")

plt.show()

Der Parameter s steuert die Markergröße in Punkten zum Quadrat. edgecolors="black" fügt jedem Punkt eine Umrandung hinzu, die es erleichtert, Punkte zu unterscheiden, wenn sie sich überlappen.

Für eine vertiefte Betrachtung, siehe das Kapitel Matplotlib Scatter Plot.

Das Erscheinungsbild von Diagrammen anpassen

Matplotlib bietet präzise Kontrolle über nahezu jedes visuelle Element.

Farben, Marker und Linienstile

Übergeben Sie einen Format-String als drittes Argument an plt.plot(), um Markerstil, Linienstil und Farbe in einem Schritt festzulegen:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, "ro--")   # red circles, dashed line
plt.xlabel("x")
plt.ylabel("y")
plt.title("Custom Style")
plt.show()

Der Format-String "ro--" kombiniert:

  • r — rote Farbe
  • o — Kreismarker
  • -- — gestrichelte Linie

Häufige Format-String-Codes:

CodeBedeutungCodeBedeutung
bblau-durchgezogene Linie
ggrün--gestrichelte Linie
rrot-.Strich-Punkt-Linie
kschwarz:gepunktete Linie
oKreissQuadrat
^Dreieck oben*Stern

Sie können auch Keyword-Argumente für mehr Kontrolle übergeben:

plt.plot(x, y, color="#2196f3", linewidth=2, linestyle="--", marker="o", markersize=8)

Figure-Größe und DPI

Legen Sie die Figure-Abmessungen (in Zoll) vor dem Plotten durch Aufruf von plt.figure() fest:

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5), dpi=100)   # 1000×500 pixels

x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

plt.plot(x, y)
plt.title("Wide Figure")
plt.show()

figsize=(width, height) nimmt Zoll als Einheit. dpi (dots per inch) steuert die Pixeldichte — 100 dpi ist für Bildschirme geeignet; 300 dpi ist typisch für den Druck.

Ein Gitter hinzufügen

Ein Gitter erleichtert das Ablesen von Werten:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [3, 7, 2, 9, 4]

plt.plot(x, y, marker="o")
plt.grid(True, linestyle="--", alpha=0.7)
plt.title("Plot with Grid")
plt.show()

alpha=0.7 macht die Gitterlinien halbtransparent, damit sie die Daten nicht überlagern. Weitere Optionen finden Sie im Kapitel Matplotlib Grid.

Subplots erstellen

Subplots ermöglichen die Anzeige mehrerer Diagramme in einer Figure, was nützlich ist, um verschiedene Ansichten desselben Datensatzes zu vergleichen.

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 4, 9, 16, 25]
y3 = [5, 3, 7, 2, 8]
y4 = [10, 7, 4, 5, 6]

fig, axes = plt.subplots(2, 2, figsize=(10, 8))

axes[0][0].plot(x, y1, "b-o")
axes[0][0].set_title("Linear")

axes[0][1].plot(x, y2, "r--s")
axes[0][1].set_title("Quadratic")

axes[1][0].bar(x, y3, color="green")
axes[1][0].set_title("Bar Chart")

axes[1][1].scatter(x, y4, color="purple", s=80)
axes[1][1].set_title("Scatter")

plt.tight_layout()   # prevent overlapping labels
plt.show()

plt.subplots(rows, cols) gibt ein Figure-Objekt und ein 2-dimensionales Array von Axes-Objekten zurück. Das Arbeiten mit einzelnen Axes-Objekten (z.B. axes[0][0].plot(...)) ist der bevorzugte Ansatz für Multi-Plot-Layouts, da er unabhängige Kontrolle über jedes Panel bietet. plt.tight_layout() passt den Abstand automatisch an, sodass sich Titel und Beschriftungen nicht überlappen.

Weitere Layoutoptionen finden Sie im Kapitel Matplotlib Subplots.

Ein Diagramm in eine Datei speichern

plt.savefig() schreibt die aktuelle Figure auf die Festplatte. Das Dateiformat wird aus der Erweiterung abgeleitet:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, marker="o")
plt.title("Saved Plot")

plt.savefig("my_plot.png", dpi=150, bbox_inches="tight")
  • Unterstützte Formate sind .png, .jpg, .svg und .pdf.
  • bbox_inches="tight" schneidet Leerraum um die Figure zu, damit nichts abgeschnitten wird.
  • Rufen Sie plt.savefig() immer vor plt.show() auf — plt.show() löscht den Figure-Zustand.

Häufige Fehler

plt.show() löscht die Figure. Wenn Sie plt.savefig() nach plt.show() aufrufen, speichern Sie ein leeres Bild. Immer zuerst speichern, dann anzeigen.

Ausführung in nicht-interaktiven Umgebungen. In Skripten öffnet plt.show() ein GUI-Fenster und blockiert, bis es geschlossen wird. In Jupyter Notebooks verwenden Sie %matplotlib inline am Anfang, damit Diagramme inline gerendert werden. Auf headless-Servern (CI, Docker) wechseln Sie zu einem nicht-interaktiven Backend: import matplotlib; matplotlib.use("Agg") vor dem Import von pyplot.

Vergessen, Figures zu schließen. Jeder Aufruf von plt.figure() öffnet eine neue Figure im Speicher. In Schleifen, die viele Diagramme generieren, schließen Sie jede mit plt.close(), um Speichererschöpfung zu vermeiden.

import matplotlib.pyplot as plt

for i in range(10):
    plt.plot([1, 2, 3], [i, i * 2, i * 3])
    plt.savefig(f"plot_{i}.png")
    plt.close()   # release memory

Überlappende Subplots. Der Aufruf von plt.tight_layout() oder plt.subplots_adjust() nach der Erstellung aller Subplots behebt überlappende Titel und Achsenbeschriftungen.

Zusammenfassung

DiagrammtypFunktionAm besten geeignet für
Liniendiagrammplt.plot()Trends über geordnete Daten
Balkendiagrammplt.bar() / plt.barh()Vergleich diskreter Kategorien
Kreisdiagrammplt.pie()Teil-zu-Ganzes-Zusammensetzung
Streudiagrammplt.scatter()Beziehung zwischen zwei Variablen
Subplotsplt.subplots()Mehrere Diagramme in einer Figure

Verwandte Kapitel

Was this page helpful?