Tabla de donas doble en matplotlib

Muy bien, aficionados a los matplotlib, sabemos cómo trazar un gráfico de anillos , pero ¿qué es mejor que un cuadro de anillos? Un cuadro de doble donut. Específicamente: tenemos un conjunto de elementos que caen en categorías y subcategorías separadas de la primera categorización. La tabla de anillos debe tener rebanadas para las categorías en el anillo exterior y rebanadas para las subcategorías en el anillo interno, obviamente alineadas con las rebanadas externas.

¿Hay alguna biblioteca que proporcione esto o necesitamos resolver esto aquí?

introduzca la descripción de la imagen aquí

Para obtener un gráfico de anillos dobles, puede trazar tantos gráficos circulares en el mismo gráfico que desee. Así que el pastel exterior tendría un width definido en sus cuñas y el pastel interno tendría un radio que es menor o igual a 1-width .

 import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots() ax.axis('equal') width = 0.3 cm = plt.get_cmap("tab20c") cout = cm(np.arange(3)*4) pie, _ = ax.pie([120,77,39], radius=1, labels=list("ABC"), colors=cout) plt.setp( pie, width=width, edgecolor='white') cin = cm(np.array([1,2,5,6,9,10])) labels = list(map("".join, zip(list("aabbcc"),map(str, [1,2]*3)))) pie2, _ = ax.pie([60,60,37,40,29,10], radius=1-width, labels=labels, labeldistance=0.7, colors=cin) plt.setp( pie2, width=width, edgecolor='white') plt.show() 

introduzca la descripción de la imagen aquí

Nota: Hice este código también disponible en la galería matplotlib como ejemplo de pastel nested .

Adapté el ejemplo que me proporcionaste; puede abordar su problema trazando dos rosquillas en la misma figura, con un radio exterior más pequeño para una de ellas.

 import matplotlib.pyplot as plt import numpy as np def make_pie(sizes, text,colors,labels, radius=1): col = [[i/255 for i in c] for c in colors] plt.axis('equal') width = 0.35 kwargs = dict(colors=col, startangle=180) outside, _ = plt.pie(sizes, radius=radius, pctdistance=1-width/2,labels=labels,**kwargs) plt.setp( outside, width=width, edgecolor='white') kwargs = dict(size=20, fontweight='bold', va='center') plt.text(0, 0, text, ha='center', **kwargs) # Group colors c1 = (226, 33, 7) c2 = (60, 121, 189) # Subgroup colors d1 = (226, 33, 7) d2 = (60, 121, 189) d3 = (25, 25, 25) make_pie([100, 80, 90], "", [d1, d3, d2], ['M', 'N', 'F'], radius=1.2) make_pie([180, 90], "", [c1, c2], ['M', 'F'], radius=1) plt.show() 

introduzca la descripción de la imagen aquí