来自数据框的嵌套饼图

Nested pie chart from dataframe

我有一个像这样的数据框 df:

product   count  Class
stuff       3      A
thing       7      A
another     1      B

我可以用我的代码制作 2 个不同的饼图:

my_data = df['count']
my_labels = df['Product']
plt.pie(my_data,labels=my_labels,autopct='%1.1f%%')
plt.title('Distribution 1')
plt.axis('equal')
plt.show()

my_data = df['count']
my_labels = df['Class']
plt.pie(my_data,labels=my_labels,autopct='%1.1f%%')
plt.title('Distribution 2')
plt.axis('equal')
plt.show()

但我想做一个可以结合两者的嵌套饼图:

当我检查时 https://matplotlib.org/3.1.1/gallery/pie_and_polar_charts/nested_pie.html 我不明白如何不使用静态值来做到这一点。

与教程类似,您可能需要稍微修改一下:

大小 = 0.3

fig, ax = plt.subplots()

ax.pie(df.groupby('Class')['count'].sum(), radius=1, 
       wedgeprops=dict(width=size, edgecolor='w'))

ax.pie(df['count'], radius=1-size, 
       wedgeprops=dict(width=size, edgecolor='w'))

ax.set(aspect="equal", title='Pie plot with `ax.pie`')

输出:

我会根据您分享的 link 更仔细地编写您的代码。只需将示例中的数组替换为您的列即可。您可能需要对标签进行一些额外的格式化,但也许它对您的实际数据没问题:

import matplotlib.pyplot as plt
df = d1.copy()
fig, ax = plt.subplots()

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

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

ax.pie(df.groupby('Class', sort=False)['count'].sum(), radius=1, colors=outer_colors, labels=df['Class'].drop_duplicates(), autopct='%1.1f%%',
       wedgeprops=dict(width=size, edgecolor='w'))

ax.pie(df['count'], radius=1-size, colors=inner_colors, labels=df['product'], autopct='%1.1f%%',
       wedgeprops=dict(width=size, edgecolor='w'))

ax.set(aspect="equal", title='Distribution 1 and 2')
plt.show()