Notiz
Klicken Sie hier , um den vollständigen Beispielcode herunterzuladen
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 method
legend
annotations
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 autopct
Argument 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.Wedge
Patches, die direkt als Griffe für eine Legende verwendet werden können. Wir können das bbox_to_anchor
Argument 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()
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 width
Einstellung zu den Keilen hat, die sich von seinem Radius unterscheidet. Es ist so einfach wie es geht. Dies geschieht über das wedgeprops
Argument.
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()
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: