Nota
Haga clic aquí para descargar el código de ejemplo completo
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
pie
mé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 width
a 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()
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()
Referencias
En este ejemplo se muestra el uso de las siguientes funciones, métodos, clases y módulos: