You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何跨第三维度绘制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不再被推荐,但如果你一定要用它,步骤如下:

  1. 用三个DataFrame构建Panel,第三维度(items)对应年份
  2. 提取你想要绘制的列(比如记录在案案件数),转置后绘图
# 构建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官方推荐的三维数据处理方式,更灵活且长期支持:

  1. 给每个DataFrame添加年份标签
  2. 合并成一个带年份+严重犯罪双索引的DataFrame
  3. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:10:12