来自 Pandas 数据透视表的堆积面积图 (matplotlib)

vfe*_*raz 2 matplotlib python-3.x pandas

我有以下格式的数据

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
Run Code Online (Sandbox Code Playgroud)

我正在尝试根据每年的值创建一个“区域”图表,按指标划分。

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

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

它以这种格式返回数据:

          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
Run Code Online (Sandbox Code Playgroud)

但是当我尝试 plot 命令时:

plot = plt.stackplot(pivot_austria.columns, pivot_austria.values, labels = pivot_austria.index)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

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

ValueError: setting an array element with a sequence
Run Code Online (Sandbox Code Playgroud)

我尝试了很多事情来绘制这个,有和没有枢轴,但到目前为止它没有工作,有人知道我可能做错了什么吗?

Sco*_*ton 5

我不确定您尝试生成哪种图,但删除值周围的 backets 会有所帮助。

让我们先试试这个:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明

或者正如@pask 在他的解决方案中所建议的那样,让 Pandas 处理它:

ax = pivot_austria.plot.area()
ax.set_xticks(pivot_austria.index)
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明

编辑以显示为百分比:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明