在饼图中对小值进行分组

数据挖掘 Python matplotlib
2022-03-12 09:07:52

当使用 Python 的 matplotlib 从字典中绘制饼图时,我得到了一些由于体积小而过于混杂在一起的类。有没有办法将最小值组合在一起,并使用 python 将它们绘制在单独的饼图(或刻度条)中?

这是我使用的代码:

import matplotlib.pyplot as plt

plt.style.use('ggplot')

dic = {'class a': 26.9,
       'Class b': 18,
       'Class c': 16.8,
       'Class d': 13,
       'Class e': 8.83,
       'Class f': 5.97,
       'Class g': 3.59,
       'Class h': 2.01,
       'Class i': 1.42,
       'Class j': 1.09,
       'Class k': 0.903,
       'Class l': 0.873,
       'Class m': 0.28,
       'Class n': 0.24,
       'Class o': 0.112}

labels = dic.keys()
sizes = dic.values()

fig, ax = plt.subplots()

ax.pie(sizes, labels=labels, autopct='%1.1f%%')
ax.axis('equal')
plt.tight_layout()
plt.show()
'''
2个回答

这可能不是最好的解决方案:

我附上了新代码,其中我使用阈值拆分数据,然后将它们分别绘制成 2 个饼图:

import matplotlib.pyplot as plt
import pandas as pd

plt.style.use('ggplot')

dic = [{'class a': 26.9,
       'Class b': 18,
       'Class c': 16.8,
       'Class d': 13,
       'Class e': 8.83,
       'Class f': 5.97,
       'Class g': 3.59,
       'Class h': 2.01,
       'Class i': 1.42,
       'Class j': 1.09,
       'Class k': 0.903,
       'Class l': 0.873,
       'Class m': 0.28,
       'Class n': 0.24,
       'Class o': 0.112}]

labels = dic.keys()
sizes = dic.values()

#converting the data into a dataframe
df = pd.DataFrame(dic)
dft = df.transpose()

dft.columns = ['Value']
dft['Class'] = dft.index

#defining the threshold 
threshold = 5
dft_subset1 =  dft[dft['Value'] <= threshold]
dft_subset2 =  dft[dft['Value'] > threshold]

plot1 = dft_subset1.plot.pie(y='Value', figsize=(5, 5))
plot2 = dft_subset2.plot.pie(y='Value', figsize=(5, 5))

输出:

输出

一个想法是通过将值低于某个阈值的所有类分组在一起,例如在本例 2 中,并将它们的值相加,从而将较小的切片组合在一起。

这是一个例子:

import matplotlib.pyplot as plt

plt.style.use('ggplot')

dic = {'Class a': 26.9,
       'Class b': 18,
       'Class c': 16.8,
       'Class d': 13,
       'Class e': 8.83,
       'Class f': 5.97,
       'Class g': 3.59,
       'Class h': 2.01,
       'Class i': 1.42,
       'Class j': 1.09,
       'Class k': 0.903,
       'Class l': 0.873,
       'Class m': 0.28,
       'Class n': 0.24,
       'Class o': 0.112}

# group together all elements in the dictionary whose value is less than 2
# name this group 'All the rest'
import itertools
newdic={}
for key, group in itertools.groupby(dic, lambda k: 'All the rest' if (dic[k]<2) else k):
     newdic[key] = sum([dic[k] for k in list(group)])   

labels = newdic.keys()
sizes = newdic.values()

fig, ax = plt.subplots()

ax.pie(sizes, labels=labels, autopct='%1.1f%%', explode=(0,0,0,0,0,0,0,0,.1), startangle=0)
ax.axis('equal')
plt.tight_layout()

plt.show()

在饼图中对较小的切片进行分组

如果显示较小切片的值很重要,只需将缺失数据的表格绘制在一边。