Eine Torte und einen Donut beschriften #

Willkommen in der Matplotlib-Bäckerei. Wir werden ein Torten- und ein Ringdiagramm durch die erstellen und zeigen, wie man sie sowohl mit a als auch mit beschriftet .pie methodlegendannotations

Wie üblich würden wir mit der Definition der Importe beginnen und eine Figur mit Subplots erstellen. Jetzt ist es Zeit für den Kuchen. Ausgehend von einem Kuchenrezept erstellen wir daraus die Daten und eine Liste mit Etiketten.

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

Wir erstellen dann den Kuchen und speichern die zurückgegebenen Objekte für später. Das erste zurückgegebene Element des zurückgegebenen Tupels ist eine Liste der Keile. Das sind matplotlib.patches.WedgePatches, die direkt als Griffe für eine Legende verwendet werden können. Wir können das bbox_to_anchorArgument der Legende verwenden, um die Legende außerhalb des Kuchens zu positionieren. Hier verwenden wir die Achsenkoordinaten zusammen mit dem Ort ; dh der linke Mittelpunkt der Legende befindet sich am linken Mittelpunkt des Begrenzungsrahmens und erstreckt sich von bis in Achsenkoordinaten.(1, 0, 0.5, 1)"center left"(1, 0)(1.5, 1)

import numpy as np
import matplotlib.pyplot as plt

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 "{:.1f}%\n({:d} g)".format(pct, absolute)


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()
Bäckerei Matplotlib: Ein Kuchen

Jetzt ist es Zeit für den Donut. Beginnend mit einem Donut-Rezept transkribieren wir die Daten in Zahlen (umwandeln von 1 Ei in 50 g) und zeichnen den Kuchen direkt. Der Kuchen? Warte... es wird ein Donut, nicht wahr? Nun, wie wir hier sehen, ist der Donut ein Kuchen, der eine bestimmte widthEinstellung zu den Keilen hat, die sich von seinem Radius unterscheidet. Es ist so einfach wie es geht. Dies geschieht über das wedgepropsArgument.

Die Keile wollen wir dann über beschriften annotations. Wir erstellen zunächst einige Wörterbücher mit gemeinsamen Eigenschaften, die wir später als Schlüsselwortargument übergeben können. Wir iterieren dann über alle Keile und für jeden

  • Berechnen Sie den Winkel der Keilmitte,

  • daraus die Koordinaten des Punktes in diesem Winkel auf dem Umfang erhalten,

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

  • Aktualisieren Sie den Verbindungsstil mit dem erhaltenen Winkel, damit der Anmerkungspfeil vom Donut nach außen zeigt.

  • Erstellen Sie schließlich die Annotation mit allen zuvor festgelegten 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 = "angle,angleA=0,angleB={}".format(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()
Bäckerei Matplotlib: Ein Donut

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

Verweise

In diesem Beispiel wird die Verwendung der folgenden Funktionen, Methoden, Klassen und Module gezeigt:

Galerie generiert von Sphinx-Gallery