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 methodlegendannotations

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 autopctargumento, 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.Wedgeparches, que se pueden usar directamente como identificadores para una leyenda. Podemos usar el bbox_to_anchorargumento 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()
Panadería Matplotlib: un pastel

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 widthjuego en las cuñas, que es diferente de su radio. Es tan fácil como parece. Esto se hace a través del wedgepropsargumento.

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()
Panadería Matplotlib: una dona

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:

Galería generada por Sphinx-Gallery