如何跨第三维度绘制Pandas Panel列?附三年同结构犯罪数据
跨维度绘制Pandas Panel列(及现代替代方案)
嘿,我来帮你搞定这个跨维度绘图的问题!首先得提个重要提醒:Pandas里的Panel已经在0.25.0版本之后被官方弃用了,现在更推荐用MultiIndex DataFrame或者xarray来处理这种三维数据。不过我还是会先给你演示Panel的用法,再分享更现代的替代方案,两种方式都能满足你的需求~
第一步:创建你的三个DataFrame
先把你给出的年度数据转换成Pandas DataFrame:
import pandas as pd import matplotlib.pyplot as plt # 2015年数据 data_2015 = { '严重犯罪': ['诱拐', '绑架', '纵火', '妨害治安', '入室行窃', '严重伤害'], '记录在案案件数': [725, 246, 466, 436, 12707, 1299], '法律事实错误': [3, 6, 1, 1, 21, 3] } df_2015 = pd.DataFrame(data_2015).set_index('严重犯罪') # 2016年数据 data_2016 = { '严重犯罪': ['诱拐', '绑架', '纵火', '妨害治安', '入室行窃', '严重伤害'], '记录在案案件数': [738, 297, 486, 394, 10287, 1205], '法律事实错误': [4, 9, 4, 1, 14, 0] } df_2016 = pd.DataFrame(data_2016).set_index('严重犯罪') # 2017年数据(补全你未写完的部分,假设为合理数值) data_2017 = { '严重犯罪': ['诱拐', '绑架', '纵火', '妨害治安', '入室行窃', '严重伤害'], '记录在案案件数': [647, 251, 418, 400, 11500, 1350], '法律事实错误': [2, 10, 3, 2, 18, 4] } df_2017 = pd.DataFrame(data_2017).set_index('严重犯罪')
方法一:使用Panel(已弃用,仅作演示)
虽然Panel不再被推荐,但如果你一定要用它,步骤如下:
- 用三个DataFrame构建Panel,第三维度(items)对应年份
- 提取你想要绘制的列(比如
记录在案案件数),转置后绘图
# 构建Panel(注意:此API已弃用,未来版本可能移除) panel = pd.Panel({'2015': df_2015, '2016': df_2016, '2017': df_2017}) # 跨年份维度绘制"记录在案案件数"的对比图 panel['记录在案案件数'].T.plot(kind='bar', figsize=(12, 6)) plt.title('各年度严重犯罪记录在案案件数对比') plt.xlabel('年份') plt.ylabel('案件数') plt.legend(title='犯罪类型') plt.show() # 同理,绘制"法律事实错误"的对比图 panel['法律事实错误'].T.plot(kind='bar', figsize=(12, 6)) plt.title('各年度严重犯罪法律事实错误数对比') plt.xlabel('年份') plt.ylabel('错误数') plt.legend(title='犯罪类型') plt.show()
方法二:使用MultiIndex DataFrame(推荐)
这是现在Pandas官方推荐的三维数据处理方式,更灵活且长期支持:
- 给每个DataFrame添加年份标签
- 合并成一个带
年份+严重犯罪双索引的DataFrame - 通过
unstack方法把犯罪类型转成列,再绘图
# 给每个DataFrame添加年份列 df_2015['年份'] = 2015 df_2016['年份'] = 2016 df_2017['年份'] = 2017 # 合并成MultiIndex DataFrame combined_df = pd.concat([df_2015, df_2016, df_2017]).reset_index().set_index(['年份', '严重犯罪']) # 绘制各年度各犯罪类型的记录在案案件数 combined_df['记录在案案件数'].unstack('严重犯罪').plot(kind='bar', figsize=(12, 6)) plt.title('各年度严重犯罪记录在案案件数对比') plt.xlabel('年份') plt.ylabel('案件数') plt.legend(title='犯罪类型') plt.show() # 绘制法律事实错误数的年度对比 combined_df['法律事实错误'].unstack('严重犯罪').plot(kind='bar', figsize=(12, 6)) plt.title('各年度严重犯罪法律事实错误数对比') plt.xlabel('年份') plt.ylabel('错误数') plt.legend(title='犯罪类型') plt.show()
小解释
unstack('严重犯罪')的作用是把MultiIndex中的严重犯罪层级从行索引转成列,这样每个犯罪类型就对应一列,年份作为行索引,刚好适合绘制年度对比的柱状图~
内容的提问来源于stack exchange,提问作者Indika Rajapaksha
相关产品推荐
相关产品推荐

