Nota
Fare clic qui per scaricare il codice di esempio completo
Etichettare una torta e una ciambella #
Benvenuto nella pasticceria Matplotlib. Creeremo un grafico a torta e ad anello attraverso e mostreremo come etichettarli con a
e con .pie method
legend
annotations
Come al solito inizieremmo definendo le importazioni e creando una figura con sottotrame. Ora è il momento della torta. Partendo da una ricetta per una torta, creiamo i dati e un elenco di etichette da essa.
Possiamo fornire una funzione autopct
all'argomento, che espanderà l'etichettatura percentuale automatica mostrando valori assoluti; calcoliamo quest'ultimo dai dati relativi e dalla somma nota di tutti i valori.
Quindi creiamo la torta e memorizziamo gli oggetti restituiti per dopo. Il primo elemento restituito della tupla restituita è un elenco dei cunei. Quelle sono
matplotlib.patches.Wedge
patch, che possono essere utilizzate direttamente come maniglie per una legenda. Possiamo usare l' bbox_to_anchor
argomento della legenda per posizionare la legenda all'esterno della torta. Qui usiamo le coordinate degli assi insieme alla posizione ; cioè il punto centrale sinistro della legenda sarà al punto centrale sinistro del riquadro di delimitazione, estendendosi da a nelle coordinate degli assi.(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()
Adesso è il momento della ciambella. Partendo da una ricetta per ciambelle, trascriviamo i dati in numeri (convertendo 1 uovo in 50 g) e tracciamo direttamente la torta. La crostata? Aspetta... sarà una ciambella, vero? Bene, come vediamo qui, la ciambella è una torta, con un certo width
set di spicchi, che è diverso dal suo raggio. È facile come sembra. Questo viene fatto tramite l' wedgeprops
argomento.
Vogliamo quindi etichettare i cunei tramite
annotations
. Per prima cosa creiamo alcuni dizionari di proprietà comuni, che possiamo poi passare come argomento di parole chiave. Quindi iteriamo su tutti i cunei e per ciascuno
calcola l'angolo del centro del cuneo,
da ciò ricavare le coordinate del punto a quell'angolo sulla circonferenza,
determinare l'allineamento orizzontale del testo, a seconda di quale lato del cerchio si trova il punto,
aggiornare lo stile di connessione con l'angolo ottenuto in modo che la freccia dell'annotazione punti verso l'esterno rispetto alla ciambella,
infine, creare l'annotazione con tutti i parametri precedentemente determinati.
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()
Ed eccola qui, la ciambella. Si noti tuttavia che se dovessimo utilizzare questa ricetta, gli ingredienti sarebbero sufficienti per circa 6 ciambelle: la produzione di una ciambella enorme non è stata testata e potrebbe causare errori in cucina.
Riferimenti
L'uso delle seguenti funzioni, metodi, classi e moduli è mostrato in questo esempio: