Pandas Pivot Dable的堆积面积图(matplotlib)

时间:2018-07-18 13:03:47

标签: python-3.x pandas matplotlib

我的数据采用以下格式

import pandas as pd
import matplotlib.pyplot as plt

    Metric  Country  Year    Value
0       2G  Austria  2018  1049522
1       2G  Austria  2019   740746
2       2G  Austria  2020   508452
3       2G  Austria  2021   343667
4       2G  Austria  2022   234456
65      3G  Austria  2018  2133823
66      3G  Austria  2019  1406927
67      3G  Austria  2020  1164042
68      3G  Austria  2021  1043169
69      3G  Austria  2022   920025
130     4G  Austria  2018  7482733
131     4G  Austria  2019  8551865
132     4G  Austria  2020  8982975
133     4G  Austria  2021  9090997
134     4G  Austria  2022  8905121
195     5G  Austria  2018        0
196     5G  Austria  2019        0
197     5G  Austria  2020    41995
198     5G  Austria  2021   188848
199     5G  Austria  2022   553826

我正在尝试根据每年的值(按指标划分)创建“面积”图表。

为此,我创建了一个数据透视表来汇总结果,如下所示:

pivot_austria = pd.pivot_table(data_austria, index=['Metric'],
                               columns=['Year'],
                               values=['Value'], 
                               aggfunc=sum, 
                               fill_value=0)

以以下格式返回数据:

          Value                                    
Year       2018     2019     2020     2021     2022
Metric                                             
2G      1049522   740746   508452   343667   234456
3G      2133823  1406927  1164042  1043169   920025
4G      7482733  8551865  8982975  9090997  8905121
5G            0        0    41995   188848   553826

但是当我尝试执行plot命令时:

plot = plt.stackplot(pivot_austria.columns, pivot_austria.values, labels = pivot_austria.index)

我收到错误

    return np.array(data, dtype=np.unicode)

ValueError: setting an array element with a sequence

无论有无枢轴,我都尝试过很多方法来绘制此图,并且到目前为止它还没有起作用,有人知道我可能做错了吗?

2 个答案:

答案 0 :(得分:3)

我不确定您要生成哪种图,但是删除值附近的背景会有所帮助。

让我们先尝试一下:

pivot_austria = pd.pivot_table(data_austria, index=['Metric'],
                               columns=['Year'],
                               values='Value', 
                               aggfunc=sum, 
                               fill_value=0)

plt.stackplot(pivot_austria.columns, pivot_austria.values, labels = pivot_austria.index)
ax = plt.gca()
ax.set_xticks(pivot_austria.columns)

输出:

enter image description here

或者就像@pask在他的解决方案中建议的那样,让熊猫来处理它:

ax = pivot_austria.plot.area()
ax.set_xticks(pivot_austria.index)

输出:

enter image description here

编辑以百分比显示:

ax = (pivot_austria / pivot_austria.sum(1).max()).plot.area()
ax.set_xticks(pivot_austria.index)
ax.set_yticklabels(['{:,.2%}'.format(x) for x in ax.get_yticks()])
ax.set_ylim(0,1)

输出:

enter image description here

答案 1 :(得分:2)

熊猫已经包括绘制区域图的简便方法

尝试:

pivot_austria.T.plot.area(xticks=pivot_austria.T.index)