Gráficos circulares anidados #

Los siguientes ejemplos muestran dos formas de crear un gráfico circular anidado en Matplotlib. Dichos gráficos a menudo se denominan gráficos de anillos.

import matplotlib.pyplot as plt
import numpy as np

La forma más sencilla de crear un gráfico circular es utilizar el piemétodo.

En este caso, el pastel toma valores correspondientes a los conteos en un grupo. Primero generaremos algunos datos falsos, correspondientes a tres grupos. En el círculo interior, trataremos cada número como perteneciente a su propio grupo. En el círculo exterior, los representaremos como miembros de sus 3 grupos originales.

El efecto de la forma de rosquilla se logra asignando una widtha las porciones del pastel a través del argumento cuñas .

fig, ax = plt.subplots()

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])

cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

ax.set(aspect="equal", title='Pie plot with `ax.pie`')
plt.show()
Gráfico circular con `ax.pie`

Sin embargo, puede lograr el mismo resultado utilizando un diagrama de barras en ejes con un sistema de coordenadas polares. Esto puede dar más flexibilidad en el diseño exacto de la trama.

En este caso, necesitamos mapear los valores x del gráfico de barras en radianes de un círculo. La suma acumulada de los valores se utiliza como los bordes de las barras.

fig, ax = plt.subplots(subplot_kw=dict(projection="polar"))

size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
# Normalize vals to 2 pi
valsnorm = vals/np.sum(vals)*2*np.pi
# Obtain the ordinates of the bar edges
valsleft = np.cumsum(np.append(0, valsnorm.flatten()[:-1])).reshape(vals.shape)

cmap = plt.colormaps["tab20c"]
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap([1, 2, 5, 6, 9, 10])

ax.bar(x=valsleft[:, 0],
       width=valsnorm.sum(axis=1), bottom=1-size, height=size,
       color=outer_colors, edgecolor='w', linewidth=1, align="edge")

ax.bar(x=valsleft.flatten(),
       width=valsnorm.flatten(), bottom=1-2*size, height=size,
       color=inner_colors, edgecolor='w', linewidth=1, align="edge")

ax.set(title="Pie plot with `ax.bar` and polar coordinates")
ax.set_axis_off()
plt.show()
Gráfico circular con `ax.bar` y coordenadas polares

Referencias

En este ejemplo se muestra el uso de las siguientes funciones, métodos, clases y módulos:

Galería generada por Sphinx-Gallery