Ein Tortendiagramm und ein Donut mit Beschriftungen#

Willkommen in der Matplotlib-Bäckerei. Wir werden ein Tortendiagramm und ein Donut-Diagramm über die Methode pie erstellen und zeigen, wie man sie mit einer Legende sowie mit Annotationen beschriftet.

Wie üblich beginnen wir mit der Definition der Importe und erstellen eine Figur mit Subplots. Jetzt ist es Zeit für das Tortendiagramm. Beginnend mit einem Tortenrezept erstellen wir die Daten und eine Liste von Beschriftungen daraus.

Wir können dem Argument autopct eine Funktion übergeben, die die automatische Prozentbeschriftung erweitert, indem sie absolute Werte anzeigt; letztere berechnen wir aus relativen Daten und der bekannten Summe aller Werte zurück.

Dann erstellen wir das Tortendiagramm und speichern die zurückgegebenen Objekte für später. Das erste zurückgegebene Element des zurückgegebenen Tupels ist eine Liste der Keile. Dies sind matplotlib.patches.Wedge-Patches, die direkt als Griffe für eine Legende verwendet werden können. Wir können das Argument bbox_to_anchor der Legende verwenden, um die Legende außerhalb des Tortendiagramms zu positionieren. Hier verwenden wir die Achsenkoordinaten (1, 0, 0.5, 1) zusammen mit der Position "center left"; d. h. der linke Mittelpunkt der Legende befindet sich am linken Mittelpunkt der Begrenzungsbox und erstreckt sich von (1, 0) bis (1.5, 1) in Achsenkoordinaten.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))

recipe = ["375 g flour",
          "75 g sugar",
          "250 g butter",
          "300 g berries"]

data = [float(x.split()[0]) for x in recipe]
ingredients = [x.split()[-1] for x in recipe]


def func(pct, allvals):
    absolute = int(np.round(pct/100.*np.sum(allvals)))
    return f"{pct:.1f}%\n({absolute:d} g)"


wedges, texts, autotexts = ax.pie(data, autopct=lambda pct: func(pct, data),
                                  textprops=dict(color="w"))

ax.legend(wedges, ingredients,
          title="Ingredients",
          loc="center left",
          bbox_to_anchor=(1, 0, 0.5, 1))

plt.setp(autotexts, size=8, weight="bold")

ax.set_title("Matplotlib bakery: A pie")

plt.show()
Matplotlib bakery: A pie

Jetzt ist es Zeit für den Donut. Beginnend mit einem Donut-Rezept transkribieren wir die Daten in Zahlen (umrechnen von 1 Ei in 50 g) und zeichnen das Tortendiagramm direkt. Das Tortendiagramm? Moment... es wird ein Donut, nicht wahr? Nun, wie wir hier sehen, ist der Donut ein Tortendiagramm mit einer bestimmten width für die Keile, die sich von seinem Radius unterscheidet. Es ist so einfach wie es nur geht. Dies geschieht über das Argument wedgeprops.

Dann wollen wir die Keile über Annotationen beschriften. Wir erstellen zuerst einige Dictionaries mit gemeinsamen Eigenschaften, die wir später als Schlüsselwortargument übergeben können. Dann iterieren wir über alle Keile und für jeden

  • berechnen wir den Winkel des Keilmittelpunkts,

  • erhalten daraus die Koordinaten des Punkts in diesem Winkel am Umfang,

  • bestimmen die horizontale Ausrichtung des Textes, je nachdem, auf welcher Seite des Kreises sich der Punkt befindet,

  • aktualisieren den Verbindungsstil mit dem erhaltenen Winkel, damit der Annotationspfeil vom Donut weg zeigt,

  • schließlich erstellen wir die Annotation mit allen zuvor bestimmten Parametern.

fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))

recipe = ["225 g flour",
          "90 g sugar",
          "1 egg",
          "60 g butter",
          "100 ml milk",
          "1/2 package of yeast"]

data = [225, 90, 50, 60, 100, 5]

wedges, texts = ax.pie(data, wedgeprops=dict(width=0.5), startangle=-40)

bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(arrowprops=dict(arrowstyle="-"),
          bbox=bbox_props, zorder=0, va="center")

for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1)/2. + p.theta1
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    connectionstyle = f"angle,angleA=0,angleB={ang}"
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    ax.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
                horizontalalignment=horizontalalignment, **kw)

ax.set_title("Matplotlib bakery: A donut")

plt.show()
Matplotlib bakery: A donut

Und hier ist er, der Donut. Beachten Sie jedoch, dass, wenn wir dieses Rezept verwenden würden, die Zutaten für etwa 6 Donuts ausreichen würden – die Herstellung eines riesigen Donuts ist ungetestet und könnte zu Küchenfehlern führen.

Referenzen

Die Verwendung der folgenden Funktionen, Methoden, Klassen und Module wird in diesem Beispiel gezeigt

Tags: component: label component: annotation plot-type: pie level: beginner

Galerie generiert von Sphinx-Gallery