HOWTO · Seaborn
So erstellen Sie ein Seaborn-Kreisdiagramm
Erstellen Sie ein Kreisdiagramm mit Matplotlibs plt.pie und den Farbpaletten von Seaborn und fügen Sie dann Beschriftungen, Prozentwerte, Abstände und Styling hinzu.
Auf dieser Seite
Erstellen Sie ein Kreisdiagramm in Python, indem Sie es mit Matplotlibs plt.pie zeichnen und die Farben der Segmente mit Seaborns sns.color_palette auswählen. Seaborn bietet keine eigene Funktion für Kreisdiagramme; in diesem Ablauf haben die beiden Bibliotheken getrennte Aufgaben, denn Seaborn liefert die Farben, während Matplotlib das Diagramm zeichnet. Sie benötigen beide Bibliotheken (pip install matplotlib seaborn). Die folgenden Beispiele verwenden Zahlenwerte für einige Kategorien, beschriften jedes Segment und zeigen dessen Anteil am Gesamtwert; ein zweites Beispiel gestaltet das Diagramm als Ringdiagramm mit Legende um, und ein letztes Beispiel zeigt den Fehler, den Matplotlib auslöst, wenn die Beschriftungen nicht zu den Werten passen.
Ein Kreisdiagramm mit Seaborn erstellen
import matplotlib.pyplot as plt
import seaborn as sns
values = [35, 21, 29, 39, 11]
labels = ["A", "B", "C", "D", "E"]
colors = sns.color_palette("pastel", n_colors=len(values))
explode = [0.08, 0, 0, 0, 0]
plt.pie(
values,
labels=labels,
colors=colors,
autopct="%1.1f%%",
explode=explode,
startangle=90,
counterclock=False,
textprops={"fontsize": 10},
wedgeprops={"linewidth": 1, "edgecolor": "white"},
)
plt.show()
Der Code erzeugt das Diagramm oben. Die fünf Werte summieren sich zu 135, daher lauten die auf den Segmenten angegebenen Prozentwerte 25,9 % für A, 15,6 % für B, 21,5 % für C, 28,9 % für D und 8,1 % für E. Segment A steht wegen seines explode-Versatzes etwas abseits der übrigen Segmente.
Ordnen Sie Werte und Beschriftungen anhand ihrer Position einander zu: Die erste Beschriftung gehört zum ersten Wert, die zweite zum zweiten und so weiter. Verwenden Sie eine Liste mit Zahlenwerten, die Teile eines Ganzen beschreiben, zum Beispiel die Anzahl der Einträge je Kategorie. Die Prozentwerte werden aus diesen Zahlen berechnet und geben daher den Anteil jeder Kategorie wieder, statt separat angegebene Prozentsätze darzustellen. Bei langen Kategorienamen sollten Sie kurze Beschriftungen verwenden oder einen Diagrammtyp wählen, der mehr Platz für Text bietet.
Die an values übergebene Liste bestimmt die relative Größe der einzelnen Segmente. plt.pie zeichnet das Diagramm, während sns.color_palette die Farben für die Segmente liefert. Der Palettenname ist eine Zeichenfolge. Ersetzen Sie "pastel" durch eine andere Seaborn-Palette, etwa "deep", "muted", "colorblind", "bright" oder "dark". Mit n_colors und der Anzahl der Datenwerte können Sie eine Farbe pro Wert anfordern.
Die Liste labels enthält die Kategorienamen in derselben Reihenfolge wie die Werte. Das Format autopct zeigt den prozentualen Anteil jedes Werts an der Summe aller Werte an. Zum Beispiel formatiert "%1.1f%%" den Prozentwert mit einer Nachkommastelle. Mit einer anderen Formatzeichenfolge ändern Sie die angezeigte Genauigkeit. Die Beschriftungen benennen die Kategorien; die Prozentwerte erleichtern den Vergleich ihrer Anteile.
Um die Segmente optisch voneinander abzusetzen, übergeben Sie explode eine Folge mit einem Eintrag pro Wert. Jeder Eintrag legt fest, wie weit das zugehörige Segment nach außen verschoben wird. Der erste Wert 0.08 rückt Kategorie A nach außen; die übrigen Nullen lassen ihre Segmente an Ort und Stelle. Passen Sie die Einträge an, um andere Kategorien hervorzuheben, oder verwenden Sie ausschließlich Nullen, wenn kein Segment verschoben werden soll.
Das Kreisdiagramm anpassen
Mit weiteren Argumenten von plt.pie können Sie Ausrichtung und Erscheinungsbild des Diagramms anpassen. startangle dreht die Ausgangsposition, und counterclock=False legt die Richtung fest, in der die Segmente gezeichnet werden. Mit shadow=True fügen Sie einen Schatten hinzu, mit textprops legen Sie die Eigenschaften des Beschriftungs- und Prozenttexts fest und mit wedgeprops gestalten Sie die Segmentgrenzen. Eine nützliche wedgeprops-Einstellung ist width: Sie schrumpft jedes Segment zum Rand hin und verwandelt das Kreisdiagramm in ein Ringdiagramm, wie das nächste Beispiel zeigt. Weitere Argumente sind frame=True für den Achsenrahmen, center=(x, y) für den Mittelpunkt des Kreisdiagramms und rotatelabels=True, um die Beschriftungen entlang ihrer Segmente zu drehen; diese booleschen Optionen verwenden die Python-Werte True oder False ohne Anführungszeichen.
import matplotlib.pyplot as plt
import seaborn as sns
values = [58, 33, 6, 3]
labels = ["Desktop", "Mobile", "Tablet", "Other"]
colors = sns.color_palette("colorblind", n_colors=len(values))
wedges, texts = plt.pie(
values,
colors=colors,
startangle=90,
counterclock=False,
wedgeprops={"width": 0.45, "linewidth": 1, "edgecolor": "white"},
)
plt.legend(wedges, labels, title="Device", loc="center left", bbox_to_anchor=(1, 0.5))
plt.title("Sessions by Device")
plt.show()
Hier behält wedgeprops={"width": 0.45, ...} nur die äußeren 45 % jedes Segments, sodass die Mitte leer bleibt. Da die Segmente diesmal keine Beschriftungen tragen, gibt plt.pie die Segmentobjekte zurück, und wenn Sie sie zusammen mit der Beschriftungsliste an plt.legend übergeben, entsteht die Legende neben dem Diagramm. plt.title fügt die Überschrift hinzu. Eine Legende ist leichter zu lesen als Beschriftungen auf den Segmenten, wenn die Kategorienamen lang sind oder mehrere Segmente dünn ausfallen; die Beispieldaten summieren sich zu 100, daher lassen sich die Segmentgrößen direkt als Prozentwerte lesen (58 %, 33 %, 6 % und 3 %).
Längen- und Wertefehler vermeiden
Jedes segmentbezogene Argument muss zu den Daten passen: labels, explode und eine Farbliste brauchen jeweils genau einen Eintrag pro Wert, und jeder Wert muss nicht-negativ sein, denn ein Segment kann keinen negativen Anteil am Ganzen einnehmen. Stimmen die Längen nicht überein, bricht plt.pie mit einem ValueError ab, statt das Diagramm zu zeichnen:
import matplotlib.pyplot as plt
values = [35, 21, 29]
labels = ["A", "B"]
plt.pie(values, labels=labels)
plt.show()
Ausgabe:
ValueError: 'labels' must be of length 'x', not 2
Die Korrektur besteht darin, labels einen Eintrag für jeden der drei Werte zu geben. Dieselbe Regel gilt für explode: Eine explode-Liste mit zwei Einträgen für drei Werte löst ValueError: 'explode' must be of length 'x', not 2 aus. Auch negative Einträge in values schlagen fehl, mit ValueError: Wedge sizes 'x' must be non negative values. Halten Sie schließlich die Zahl der Kategorien klein: Bei vielen dünnen Segmenten stoßen die Beschriftungen aneinander und die Anteile werden schwer vergleichbar; fassen Sie daher kleine Kategorien zu einem Segment „Other“ zusammen oder wechseln Sie zu einem Balkendiagramm.