我有一个相框,例如:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Sample data
data = {
    'genus': ['SpeciesA', 'SpeciesB', 'SpeciesC', 'SpeciesD', 'SpeciesE', 'SpeciesF', 'SpeciesG', 'SpeciesH'],
    'count': [10, 2, 1, 1, 1, 1, 1, 1],
    'Type': ['Animal', 'Environment', 'Environment', 'Environment', 'Animal', 'Animal', 'Animal/Environment', 'Animal/Environment']
}

# Create DataFrame
df = pd.DataFrame(data)

>>> df

      genus  count                Type
0  SpeciesA     10              Animal
1  SpeciesB      2         Environment
2  SpeciesC      1         Environment
3  SpeciesD      1         Environment
4  SpeciesE      1              Animal
5  SpeciesF      1              Animal
6  SpeciesG      1  Animal/Environment
7  SpeciesH      1  Animal/Environment

我想使用Python创建一个饼图,其中piechart被按总计数成比例分成每个类型

到目前为止,我可以使用:

# Group by 'Type' and sum up 'count' within each group
type_counts = df.groupby('Type')['count'].sum()

# Create pie chart
plt.figure(figsize=(8, 8))
plt.pie(type_counts, labels=type_counts.index, startangle=140)
plt.title('Distribution of Counts by Type')
plt.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
plt.show()

enter image description here

但我现在正在寻找一种方法来将属标签添加到特定的子饼图部分中.

此类标签应该以这种方式包含(A):

通过优化空间,标签被随机放置在相应的饼图中,而不会重叠.

或者,如果不可能简单地以这种方式放置它们(B):

enter image description here

推荐答案

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data = {
    'genus': ['SpeciesA', 'SpeciesB', 'SpeciesC', 'SpeciesD', 'SpeciesE', 'SpeciesF', 'SpeciesG', 'SpeciesH'],
    'count': [10, 2, 1, 1, 1, 1, 1, 1],
    'Type': ['Animal', 'Environment', 'Environment', 'Environment', 'Animal', 'Animal', 'Animal/Environment', 'Animal/Environment']
}

df = pd.DataFrame(data)
plt.figure(figsize=(20, 20))
fig, ax = plt.subplots()

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

ax.pie(df.groupby('Type', sort=False)['count'].sum(), colors=outer_colors, radius=1,  labels=df['Type'].drop_duplicates(),  autopct='%.0f%%', textprops={'size': 'smaller'},        pctdistance = 1.1, 
        labeldistance = 1.2,)
ax.pie(df['count'], radius=1-size, colors=inner_colors, labels=df['genus'],  autopct='%.0f%%', textprops={'size': 'smaller', 'color':"w"}, labeldistance=1, rotatelabels = 270)
plt.show()

Output:

enter image description here

Python相关问答推荐

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

分组数据并删除重复数据

Pandas 滚动最接近的价值

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

如何使用数组的最小条目拆分数组

使用setuptools pyproject.toml和自定义目录树构建PyPi包

我们可以为Flask模型中的id字段主键设置默认uuid吗

在Python中动态计算范围

使用密钥字典重新配置嵌套字典密钥名

Django admin Csrf令牌未设置

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

OpenGL仅渲染第二个三角形,第一个三角形不可见

如何按row_id/row_number过滤数据帧

使用嵌套对象字段的Qdrant过滤

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

提取数组每行的非零元素

python的文件. truncate()意外地没有截断'