【问题标题】:Python Pandas: Plotting 100% stacked graph issuePython Pandas:绘制 100% 堆叠图问题
【发布时间】:2016-08-15 12:35:21
【问题描述】:

我得到了一个带有下表的数据帧 df5,我从 read_csv 中读取了该表,

Week_Days,Category,Total_Products_Sold,Total_Profit
0.Monday,A,3221,9999.53
0.Monday,B,1038,26070.33
0.Monday,C,699,13779.56
0.Monday,E,3055,18157.26
0.Monday,F,47569,215868.15
0.Monday,G,2348,23695.25
0.Monday,H,6,57
0.Monday,I,14033,64594.24
0.Monday,J,13876,47890.91
0.Monday,K,3878,14119.74
0.Monday,L,243,2649.6
0.Monday,M,2992,16757.38
1.Tuesday,A,2839,8864.78
1.Tuesday,B,1013,26254.69
1.Tuesday,C,656,13206.98
1.Tuesday,E,2696,15872.45
1.Tuesday,F,43039,197621.18
1.Tuesday,G,2107,21048.72
1.Tuesday,H,3,17
1.Tuesday,I,12297,56942.99
1.Tuesday,J,12095,40724.2
1.Tuesday,K,3418,12551.26
1.Tuesday,L,243,2520.3
1.Tuesday,M,2375,13268.28
2.Wednesday,A,2936,9119.93
2.Wednesday,B,1061,26927.86
2.Wednesday,C,634,10424.05
2.Wednesday,E,2835,16627.35
2.Wednesday,F,46128,218014.59
2.Wednesday,G,1986,19173.64
4.Friday,H,24,233
4.Friday,I,17576,81648.75
4.Friday,J,16468,55820.9
4.Friday,K,4294,16603.39
4.Friday,L,440,4258.51
4.Friday,M,3600,20142.44
5.Saturday,A,4658,15051.13
5.Saturday,B,1492,38236.07
5.Saturday,C,1057,15449.7
5.Saturday,E,5335,29904.96
5.Saturday,F,79925,362120.61
5.Saturday,G,4324,44088.79
5.Saturday,H,26,933
5.Saturday,I,22688,106313.86
5.Saturday,J,21882,74725.11
5.Saturday,K,5402,20875.84
5.Saturday,L,458,4692.84
5.Saturday,M,4896,27769.68
6.Sunday,A,3429,11310.1
6.Sunday,B,1104,27282.99
6.Sunday,C,1051,11567.08
6.Sunday,E,3913,22740.63
6.Sunday,F,56048,259105.03
6.Sunday,G,3224,32528.39
6.Sunday,H,21,749
6.Sunday,I,15853,74876.77
6.Sunday,J,16072,55259.76
6.Sunday,K,4383,16058.36
6.Sunday,L,327,3348.82
6.Sunday,M,3551,20814.05

我想分别绘制 2 个 100% 堆积条形图,分别代表已售出的总产品和总利润,其中 x 轴是工作日,标签是不同的类别。

我的总产品销售代码是

df5 = df5.set_index(['Week_Days', 'Category'])
df5 = df5.div(df5.sum(1), axis=0)
ax = df5[['Total_Products_Sold']].plot(kind='bar', stacked=True, width = 0.3, figsize=(20, 10), colormap="RdBu")
patches, labels = ax.get_legend_handles_labels()
ax.legend(bbox_to_anchor=(1.1, 1.0))
ax.set_xlabel('Week Days')
ax.set_ylabel('Products Sold')

我返回的图表看起来没什么我需要的。它不是 100 堆叠,图例是 Total Products Sold 而不是 Category 中的不同类别。

有人可以帮忙吗?谢谢。

问候, 大厅

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    最简单的方法是使用您关心的值制作数据透视表。试试这样的:

    tps = df5.pivot_table(values=['Total_Products_Sold'], 
                          index='Week_Days',
                          columns='Category',
                          aggfunc='sum')
    
    tps = tps.div(tps.sum(1), axis=0)
    tps.plot(kind='bar', stacked=True)
    

    对我来说,这会产生以下结果:

    您可以分别为Total_Profit 做同样的事情。

    【讨论】:

    • 嗨休谟,谢谢你,是的,它现在工作了。在 Excel 数据透视表中播放数据后,我也在考虑相同的思路。请再问1个问题。图表中的标签显示 (Total Products Sold, A) (Total Products Sold, B) 等等。是因为我使用了 -> patch, labels = ax.get_legend_handles_labels() 吗?如何解决此问题以仅显示 A、B、C...?
    • 在数据透视表之后添加以下行应删除多索引列的第一级(在此数据透视表中只是“Total_Products_Sold”):tps.columns = tps.columns.droplevel()
    猜你喜欢
    • 2022-01-08
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多