如何在Python的Matplotlib中绘制嵌套饼图?

如何在Python的Matplotlib中绘制嵌套饼图?,python,pandas,matplotlib,pie-chart,Python,Pandas,Matplotlib,Pie Chart,我在Python的Matplotlib中绘制嵌套饼图时遇到了一个问题。我写了一些代码来处理这个过程,但我有一个与设计和标签相关的问题 我想画一种这种嵌套的饼图。(从嵌套的最上层到最内层是性别,与覆盖其计数对齐) 这是我的数据框,如下所示 ALIGN SEX count 2 Bad Characters Male Characters 1542 5 Good Characters Male Characters 1419 3 Good Characters Female Char

我在Python的Matplotlib中绘制嵌套饼图时遇到了一个问题。我写了一些代码来处理这个过程,但我有一个与设计和标签相关的问题

我想画一种这种嵌套的饼图。(从嵌套的最上层到最内层是性别,与覆盖其计数对齐)

这是我的数据框,如下所示

ALIGN   SEX count
2   Bad Characters  Male Characters 1542
5   Good Characters Male Characters 1419
3   Good Characters Female Characters   714
0   Bad Characters  Female Characters   419
8   Neutral Characters  Male Characters 254
6   Neutral Characters  Female Characters   138
1   Bad Characters  Genderless Characters   9
4   Good Characters Genderless Characters   4
7   Neutral Characters  Genderless Characters   3
9   Reformed Criminals  Male Characters 2
fig, ax = plt.subplots(figsize=(24,12))
size = 0.3

ax.pie(dc_df_ALIGN_SEX.groupby('SEX')['count'].sum(), radius=1,
       labels=dc_df_ALIGN_SEX['SEX'].drop_duplicates(),
       autopct='%1.1f%%',
       wedgeprops=dict(width=size, edgecolor='w'))

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

ax.set(aspect="equal", title='Pie plot with `ax.pie`')
plt.show()
下面是与显示嵌套饼图相关的代码片段,如下所示

ALIGN   SEX count
2   Bad Characters  Male Characters 1542
5   Good Characters Male Characters 1419
3   Good Characters Female Characters   714
0   Bad Characters  Female Characters   419
8   Neutral Characters  Male Characters 254
6   Neutral Characters  Female Characters   138
1   Bad Characters  Genderless Characters   9
4   Good Characters Genderless Characters   4
7   Neutral Characters  Genderless Characters   3
9   Reformed Criminals  Male Characters 2
fig, ax = plt.subplots(figsize=(24,12))
size = 0.3

ax.pie(dc_df_ALIGN_SEX.groupby('SEX')['count'].sum(), radius=1,
       labels=dc_df_ALIGN_SEX['SEX'].drop_duplicates(),
       autopct='%1.1f%%',
       wedgeprops=dict(width=size, edgecolor='w'))

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

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

我如何设计4行4列,并将每个列放入每个插槽中,并在图例区域中显示标签?

您定义函数
百分比增长(l)
的方式假定其参数
l
为列表(或其他一维对象)。但是(为了分配
颜色
),您可以在
dc\u df\u ALIGN\u SEX
上调用此函数,这显然是您的数据帧。因此,函数(在其循环的第一次迭代中)尝试计算
dc\u df\u ALIGN\u SEX[0]
,这会抛出关键错误,因为这不是索引数据帧的正确方法


也许你想做一些类似于
增长百分比(dc\u df\u ALIGN\u SEX['count'])
的事情来代替它?

因为问题已经改变了,我发布了一个新的答案

首先,我稍微简化了您的数据帧:

将熊猫作为pd导入
df=pd.DataFrame([['Bad','Male',1542],
['Good','Male',1419],
['Good','femal',714],
['Bad','femal',419],
[‘中立’,‘男性’,254],
[‘中立’,‘女性’,138],
[‘坏’,‘无性别’,9],
[“好”,“无性别”,4],
[“中立”,“无性别”,3],
[‘改革’、‘男性’,2]]
df.columns=['ALIGN','SEX','n']
对于外圈中的数字,我们可以使用一个简单的
groupby
,就像您所做的那样:

outer=df.groupby('SEX').sum()
但对于内环中的数字,我们需要根据两个分类变量进行分组,这将产生一个多索引:

inner=df.groupby(['SEX','ALIGN']).sum()
内部的
我们可以使用其
get\u level\u values()
方法从多索引中提取适当的标签:

internal\u labels=internal.index.get\u level\u值(1)
现在,您可以将上述值转换为一维数组,并将其插入到绘图调用中:

导入matplotlib.pyplot作为plt
将numpy作为np导入
图,ax=plt.子批次(图尺寸=(24,12))
尺寸=0.3
ax.pie(outer.values.flatte(),半径=1,
标签=外部索引,
自动扫描=“%1.1f%%”,
wedgeprops=dict(宽度=尺寸,边沿颜色='w'))
ax.pie(inner.values.flatte(),半径=1-size,
标签=内部标签,
wedgeprops=dict(宽度=尺寸,边沿颜色='w'))
ax.set(aspect=“equal”,title=”带有“ax.Pie”的饼图)
plt.show()

我遇到了这种类型的错误
TypeError:'method'对象不可编辑
Ah,我明白了:
count
是一个不幸的列名,因为它也是一个方法的名称。我编辑了建议的函数调用,但更改列名可能是最安全的。另外,如果还有更多问题,最好知道上面代码中的
frame
是什么。我更新了我的问题。你能看一下吗?如果你有任何想法,你能看一下我的另一个问题吗?这里是链接:除了不重叠的标签外,我还将每个图放入子图中4行4列的每个槽中。我该怎么做?