【问题标题】:Plotting proportional data python (stacked barplot)绘制比例数据python(堆叠条形图)
【发布时间】:2016-06-23 19:27:39
【问题描述】:

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

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

如何将其放入堆积条形图中,每个答案一个条形和每个类别的彩色区域?

【问题讨论】:

    标签: python pandas matplotlib data-visualization


    【解决方案1】:

    一旦我有了最后一个数据框,我就可以很容易地得到它。通过这样做:

    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,这增加了一个全新的刻度。

    【讨论】:

    • 伙计,这是一个坏蛋一个班轮!
    【解决方案2】:

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

    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 中迭代并添加条形的高度。

    颜色数组只是为了更好地区分条形。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您可以使用 matplotlib 库制作条形图。关注这个教程:http://matplotlib.org/examples/api/barchart_demo.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-10
        • 2021-12-22
        • 2023-01-21
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        相关资源
        最近更新 更多