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 matplotlibJedes Beispiel in diesem Kapitel beginnt mit diesem Import:
import matplotlib.pyplot as pltplt 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:
| Parameter | Bedeutung |
|---|---|
values | Numerische Daten; Matplotlib rechnet sie in Proportionen um |
labels | Kategorienamen, die neben jedem Segment angezeigt werden |
autopct | Formatierungsstring 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 ist1.1(knapp außerhalb des Segments).pctdistance— Abstand des autopct-Prozentwerts vom Mittelpunkt. Standardwert ist0.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:
| Option | Wirkung |
|---|---|
dpi=150 | Auflösung in Punkte pro Zoll (72–300 für typische Anwendungen) |
bbox_inches='tight' | Beschneidet Leerraum um die Abbildung |
transparent=True | Speichert 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
| Parameter | Typ | Standard | Zweck |
|---|---|---|---|
x | sequence | — | Die Datenwerte |
labels | list | None | Kategorienamen |
colors | list | cycle | Segmentfarben |
explode | tuple | None | Versatz pro Segment vom Mittelpunkt |
autopct | str / callable | None | Format für Prozentwertbeschriftungen |
pctdistance | float | 0.6 | Abstand des Prozentwert-Labels vom Mittelpunkt |
labeldistance | float | 1.1 | Abstand des Kategorienlabels vom Mittelpunkt |
startangle | float | 0 | Startwinkel in Grad |
shadow | bool | False | Schlagschatten |
wedgeprops | dict | None | Eigenschaften für jedes Segment (z. B. width für Donut) |
counterclock | bool | True | Zeichenrichtung der Segmente |
Verwandte Themen
- Matplotlib Balkendiagramme — besser als Kreisdiagramme, wenn viele Kategorien vorhanden sind oder präzise Vergleiche nötig sind.
- Matplotlib Histogramme — zur Visualisierung der Verteilung kontinuierlicher Daten.
- Matplotlib Beschriftungen — wie Achsenbeschriftungen, Titel und Anmerkungen hinzugefügt und gestaltet werden.
- Matplotlib Teildiagramme — mehrere Diagramme auf einer Abbildung platzieren.