W3docs

Matplotlib Kreisdiagramme

Kreisdiagramme in Python mit Matplotlib erstellen und anpassen: Farben, Explode, Donut-Charts, Beschriftungen, Legenden und Dateiexport.

Kreisdiagramme unterteilen einen Kreis in Segmente, wobei der Winkel jedes Segments proportional zum dargestellten Wert ist. Sie eignen sich am besten für eine kleine Anzahl von Kategorien (idealerweise 2–6), wenn man zeigen möchte, wie jeder Teil zum Ganzen beiträgt — zum Beispiel Marktanteile nach Produkt oder Budgetverteilung nach Abteilung.

Dieses Kapitel behandelt alles von einem minimalen ersten Diagramm bis hin zu fortgeschrittenen Techniken wie Donut-Charts, benutzerdefinierter Beschriftungsplatzierung und dem Speichern druckfertiger Abbildungen. Alle Beispiele verwenden matplotlib.pyplot, die standardmäßige High-Level-API.

Installation und Einrichtung

Falls Matplotlib noch nicht installiert ist, führe diesen Befehl im Terminal aus:

pip install matplotlib

Jedes Beispiel in diesem Kapitel beginnt mit diesem Import:

import matplotlib.pyplot as plt

plt ist der übliche Alias für matplotlib.pyplot. Er stellt Funktionen wie plt.pie(), plt.title() und plt.show() bereit.

Ein einfaches Kreisdiagramm erstellen

plt.pie() ist die zentrale Funktion. Sie erwartet mindestens eine Folge numerischer Werte — die Proportionen werden automatisch berechnet.

import matplotlib.pyplot as plt

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]

plt.pie(values, labels=labels, autopct='%1.1f%%')
plt.title('Website Visitors by Device')
plt.show()

Wichtige verwendete Parameter:

ParameterBedeutung
valuesNumerische Daten; Matplotlib rechnet sie in Proportionen um
labelsKategorienamen, die neben jedem Segment angezeigt werden
autopctFormatierungsstring für Prozentwerte; '%1.1f%%' ergibt 60.0%

Das Diagramm zeichnet die Segmente standardmäßig gegen den Uhrzeigersinn ab der 3-Uhr-Position. Im nächsten Abschnitt wird erklärt, wie das geändert werden kann.

Drehung mit startangle steuern

Mit startangle=90 wird das gesamte Diagramm so gedreht, dass das erste Segment an der 12-Uhr-Position beginnt — für die meisten Betrachter der natürlichste Ausgangspunkt.

import matplotlib.pyplot as plt

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]

plt.pie(
    values,
    labels=labels,
    autopct='%1.1f%%',
    startangle=90,
)
plt.title('Website Visitors by Device')
plt.show()

startangle akzeptiert jeden Winkel in Grad, gemessen gegen den Uhrzeigersinn von der positiven x-Achse. Ein Wert von 90 zeigt senkrecht nach oben.

Farben anpassen

Übergebe eine Liste von Hex-Farbcodes oder benannten Farben an den Parameter colors. Die Liste muss mindestens so lang sein wie die Daten.

import matplotlib.pyplot as plt

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]
colors = ['#ff9999', '#66b3ff', '#99ff99']

plt.pie(
    values,
    labels=labels,
    colors=colors,
    autopct='%1.1f%%',
    startangle=90,
)
plt.title('Website Visitors by Device')
plt.show()

Es können auch die eingebauten Farbpaletten von Matplotlib verwendet werden. Um beispielsweise drei Farben aus der tab10-Palette zu entnehmen:

import matplotlib.pyplot as plt
import matplotlib.cm as cm

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]

cmap = cm.get_cmap('tab10')
colors = [cmap(i) for i in range(len(values))]

plt.pie(values, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
plt.title('Website Visitors by Device')
plt.show()

Ein Segment hervorheben (Explode)

Der Parameter explode verschiebt ein oder mehrere Segmente nach außen, um die Aufmerksamkeit darauf zu lenken. Er erwartet ein Tupel von Float-Werten, einen pro Segment. Ein Wert von 0.1 verschiebt ein Segment um 10 % des Diagrammradius.

import matplotlib.pyplot as plt

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]
colors = ['#ff9999', '#66b3ff', '#99ff99']
explode = (0.1, 0, 0)   # offset the first slice (Desktop) only

plt.pie(
    values,
    labels=labels,
    colors=colors,
    explode=explode,
    autopct='%1.1f%%',
    startangle=90,
    shadow=True,          # drop shadow for depth
)
plt.title('Website Visitors by Device')
plt.show()

Mit shadow=True wird ein dezenter Schlagschatten hinzugefügt, der das hervorgehobene Segment zusätzlich betont.

Titel und Legende hinzufügen

Verwende plt.title() für den Diagrammtitel und plt.legend() für eine separate Legende. Eine Legende ist nützlich, wenn der Beschriftungstext lang ist oder die Segmente zu klein sind, um sie direkt zu beschriften.

import matplotlib.pyplot as plt

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]
colors = ['#ff9999', '#66b3ff', '#99ff99']

plt.pie(
    values,
    labels=labels,
    colors=colors,
    autopct='%1.1f%%',
    startangle=90,
)
plt.title('Website Visitors by Device')
plt.legend(title='Device type', loc='lower right')
plt.show()

loc akzeptiert Standardpositionsstrings wie 'upper right', 'lower left' und 'center'. Für eine genaue Positionierung auf Pixelebene kann auch ein bbox_to_anchor-Tupel angegeben werden.

Abstände der Beschriftungen steuern

Zwei Parameter steuern, wie weit die Beschriftungen vom Mittelpunkt des Diagramms entfernt sind:

  • labeldistance — Abstand des Kategorienlabels vom Mittelpunkt, als Bruchteil des Radius. Standardwert ist 1.1 (knapp außerhalb des Segments).
  • pctdistance — Abstand des autopct-Prozentwerts vom Mittelpunkt. Standardwert ist 0.6 (innerhalb des Segments).
import matplotlib.pyplot as plt

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]

plt.pie(
    values,
    labels=labels,
    autopct='%1.1f%%',
    startangle=90,
    labeldistance=1.2,   # push category labels further out
    pctdistance=0.75,    # move percentages slightly outward from center
)
plt.title('Website Visitors by Device')
plt.show()

Erhöhe pctdistance, wenn Segmente groß sind und die Standardposition unübersichtlich wirkt; verringere den Wert bei vielen kleinen Segmenten.

Ein Donut-Diagramm erstellen

Ein Donut-Diagramm ist ein Kreisdiagramm mit einem Loch in der Mitte. Mit dem Parameter wedgeprops lässt sich die Ringbreite festlegen, ausgedrückt als Bruchteil des Radius. Beispielsweise lässt width=0.5 50 % des Radius als Loch frei.

import matplotlib.pyplot as plt

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]
colors = ['#ff9999', '#66b3ff', '#99ff99']

plt.pie(
    values,
    labels=labels,
    colors=colors,
    autopct='%1.1f%%',
    startangle=90,
    pctdistance=0.85,
    wedgeprops=dict(width=0.5),   # ring width = 50 % of radius
)
plt.title('Website Visitors by Device')
plt.show()

Donut-Diagramme sind beliebt, weil der leere Mittelpunkt Platz für eine Gesamtanzahl oder eine Zusammenfassung bietet, die mit plt.text(0, 0, 'Total\n100', ha='center', va='center', fontsize=14) hinzugefügt werden kann.

Mehrere Kreisdiagramme nebeneinander

Mit plt.subplots() lassen sich zwei oder mehr Kreisdiagramme auf derselben Abbildung platzieren. Jeder ax.pie()-Aufruf bezieht sich auf sein eigenes Achsenobjekt.

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))

# --- Chart 1: this month ---
labels = ['Desktop', 'Mobile', 'Tablet']
values_this_month = [60, 30, 10]
ax1.pie(values_this_month, labels=labels, autopct='%1.1f%%', startangle=90)
ax1.set_title('This Month')

# --- Chart 2: last month ---
values_last_month = [70, 20, 10]
ax2.pie(values_last_month, labels=labels, autopct='%1.1f%%', startangle=90)
ax2.set_title('Last Month')

fig.suptitle('Website Visitors by Device', fontsize=14)
plt.tight_layout()
plt.show()

fig.suptitle() fügt einen Titel oberhalb aller Teildiagramme hinzu. plt.tight_layout() verhindert überlappende Beschriftungen zwischen den Diagrammen.

Ein Kreisdiagramm in eine Datei speichern

Ersetze plt.show() durch plt.savefig(), um das Diagramm auf der Festplatte zu speichern statt es in einem Fenster anzuzeigen. Dies ist unerlässlich für Skripte, die auf headless-Servern laufen, oder zum Erzeugen von Bericht-Assets.

import matplotlib.pyplot as plt

labels = ['Desktop', 'Mobile', 'Tablet']
values = [60, 30, 10]

plt.pie(values, labels=labels, autopct='%1.1f%%', startangle=90)
plt.title('Website Visitors by Device')
plt.savefig('pie_chart.png', dpi=150, bbox_inches='tight')

Häufige savefig()-Optionen:

OptionWirkung
dpi=150Auflösung in Punkte pro Zoll (72–300 für typische Anwendungen)
bbox_inches='tight'Beschneidet Leerraum um die Abbildung
transparent=TrueSpeichert mit transparentem Hintergrund
format='svg'Schreibt Vektor-SVG statt Raster-PNG

Häufige Fallstricke

Werte, die nicht 100 ergeben. plt.pie() normalisiert die Werte immer so, dass die Segmente den vollen Kreis füllen. Wenn die Werte Prozentwerte sind, die bereits 100 ergeben, ist das kein Problem. Wenn es sich um rohe Zählwerte handelt, ebenfalls nicht — Matplotlib teilt jeden Wert durch die Gesamtsumme. Das autopct-Label zeigt immer den Anteil, nicht den Rohwert.

Null- oder negative Werte. Matplotlib überspringt Segmente mit dem Wert null stillschweigend (sie erzeugen kein sichtbares Segment). Negative Werte lösen einen ValueError aus. Filtere sie heraus, bevor plt.pie() aufgerufen wird.

Zu viele Segmente. Kreisdiagramme werden mit mehr als 6–8 Segmenten unleserlich. Bei vielen Kategorien empfiehlt sich stattdessen ein Balkendiagramm. Alternativ können die kleinsten Kategorien in einem „Sonstige"-Segment zusammengefasst werden.

Überlappende Beschriftungen. Bei kleinen Segmenten kollidieren Beschriftungen. Abhilfe schaffen: labeldistance erhöhen, eine Legende statt direkter Beschriftungen verwenden (setze labels=None und rufe plt.legend() auf) oder ein Donut-Diagramm verwenden, das außen mehr Platz bietet.

Kurzreferenz

ParameterTypStandardZweck
xsequenceDie Datenwerte
labelslistNoneKategorienamen
colorslistcycleSegmentfarben
explodetupleNoneVersatz pro Segment vom Mittelpunkt
autopctstr / callableNoneFormat für Prozentwertbeschriftungen
pctdistancefloat0.6Abstand des Prozentwert-Labels vom Mittelpunkt
labeldistancefloat1.1Abstand des Kategorienlabels vom Mittelpunkt
startanglefloat0Startwinkel in Grad
shadowboolFalseSchlagschatten
wedgepropsdictNoneEigenschaften für jedes Segment (z. B. width für Donut)
counterclockboolTrueZeichenrichtung der Segmente

Verwandte Themen

Was this page helpful?