Nota
Haga clic aquí para descargar el código de ejemplo completo
Etiquetado de un pastel y una dona #
Bienvenido a la panadería Matplotlib. Crearemos un gráfico circular y uno de anillos a través de y mostraremos cómo etiquetarlos con a
y con .pie method
legend
annotations
Como de costumbre, comenzaríamos definiendo las importaciones y creando una figura con subtramas. Ahora es el momento del pastel. Comenzando con una receta de pastel, creamos los datos y una lista de etiquetas a partir de ellos.
Podemos proporcionar una función al autopct
argumento, que expandirá el etiquetado de porcentaje automático al mostrar valores absolutos; calculamos este último a partir de datos relativos y la suma conocida de todos los valores.
Luego creamos el pastel y almacenamos los objetos devueltos para más adelante. El primer elemento devuelto de la tupla devuelta es una lista de cuñas. Esos son
matplotlib.patches.Wedge
parches, que se pueden usar directamente como identificadores para una leyenda. Podemos usar el bbox_to_anchor
argumento de la leyenda para colocar la leyenda fuera del pastel. Aquí usamos las coordenadas de los ejes junto con la ubicación ; es decir, el punto central izquierdo de la leyenda estará en el punto central izquierdo del cuadro delimitador, abarcando de a en coordenadas de ejes.(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()
Ahora es el momento de la dona. Comenzando con una receta de donas, transcribimos los datos a números (convirtiendo 1 huevo en 50 g) y trazamos directamente el pastel. ¿El pastel? Espera... va a ser una dona, ¿no es así? Bueno, como vemos aquí, la rosquilla es un pastel, que tiene un cierto width
juego en las cuñas, que es diferente de su radio. Es tan fácil como parece. Esto se hace a través del wedgeprops
argumento.
Luego queremos etiquetar las cuñas a través de
annotations
. Primero creamos algunos diccionarios de propiedades comunes, que luego podemos pasar como argumento de palabra clave. Luego iteramos sobre todas las cuñas y para cada
calcular el ángulo del centro de la cuña,
a partir de ahí obtener las coordenadas del punto en ese ángulo sobre la circunferencia,
determinar la alineación horizontal del texto, dependiendo de qué lado del círculo se encuentra el punto,
actualice el estilo de conexión con el ángulo obtenido para que la flecha de anotación apunte hacia afuera desde la dona,
finalmente, crea la anotación con todos los parámetros previamente determinados.
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()
Y aquí está, la dona. Sin embargo, tenga en cuenta que si usáramos esta receta, los ingredientes serían suficientes para alrededor de 6 donas: producir una dona enorme no se ha probado y podría provocar errores en la cocina.
Referencias
En este ejemplo se muestra el uso de las siguientes funciones, métodos, clases y módulos: