绘制比例数据python(堆积条形图)

时间:2016-06-23 09:30:22

标签: python pandas matplotlib data-visualization

我有一个数据集,客户回答问题,客户属于某个类别。该类别是序数。我想将百分比的变化可视化为比例堆积的条形图。以下是一些测试数据:

answer | categ
1        1
2        1
3        2
1        2
2        3
3        3
1        1
2        1
3        2
1        2
2        3
3        3
1        3
2        2
3        1

以下是如何生成它:

pd.DataFrame({'answer':[1,2,3]*5, 'categ':[1,1,2,2,3,3]*2+[3,2,1]})

使用一些可能写得更好,效率更高的复杂代码,我得到答案中的百分比。

test = pd.DataFrame({'answer':[1,2,3]*5, 'categ':[1,1,2,2,3,3]*2+[3,2,1]})
rel_data = pd.merge(pd.DataFrame(test.groupby(['answer','categ']).size()).reset_index(),pd.DataFrame(test.groupby('answer').size()).reset_index(), how='left', on='answer')
rel_data.columns = ['answer', 'categ', 'number_combination', 'number_answer']
rel_data['perc'] = rel_data['number_combination']/rel_data['number_answer']
rel_data[['answer', 'categ', 'perc']]

这导致:

answer | categ | perc
1        1       0.4
1        2       0.4
1        3       0.2
2        1       0.4
2        2       0.2
2        3       0.4
3        1       0.2
3        2       0.4
3        3       0.4

我如何将其添加到堆积条形图中,每个答案都有一个条形图和每个类别的彩色区域?

3 个答案:

答案 0 :(得分:2)

一旦我拥有了最后一个数据帧,我就可以轻松地获得它。通过这样做:

rel_data = rel_data.groupby(['answer','categ']).\
    perc.sum().unstack().plot(kind='bar', stacked=True, ylim=(0,1))

又脏了,但至少它完成了工作。 perc.sum将每个组转换为一个值(即使它已经是那个),unstack()将其转换为DF,类别为列,答案为行,图表将其转换为比例堆叠的条形图。 ylim是由于一些微小的舍入错误,它可以加起来为1.00001,这增加了一个全新的滴答。

答案 1 :(得分:0)

这绝不是完美的,但它是一个开始:

for i in set(df.categ):
    colors = ["r", "g", "b", "y", "o"] #etc....
    if i == 1:
        x = np.zeros(len(set(df.answer)))
    else:
        x += df[df.categ == i - 1].perc.as_matrix()

    plt.bar(df[df.categ == i].answer, df[df.categ == i].perc, bottom=x, color=colors[i - 1])

plt.xticks(list(set(df.answer)))
plt.show()

方法是首先按类别对数据进行分组,然后我们可以迭代每个类别以获得将作为单个条形的答案。然后我们通过i == 1检查检查它是否是第一次迭代。这将创建一个空数组,将在堆叠时使用。然后我们绘制第一个条形图。然后,当我们进入变量x时,我们迭代并添加条的高度。

颜色数组就在那里,你可以更好地区分条形。

希望这有帮助。

答案 2 :(得分:-1)

您可以使用matplotlib库制作条形图。请关注此tuto:http://matplotlib.org/examples/api/barchart_demo.html

相关问题