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

Seaborn绘制多组数据重叠直方图结果异常如何解决

你当前代码的核心问题是传入绘图函数的字段错误。sns.distplot()默认会统计传入列的数值出现频次,你现在传入的是month_box月份列,所以输出的图展示的是不同月份在你的DataFrame中出现的次数,和你需要展示的「当月项目数量」完全无关。


需求1:展示三个区域每月项目数量的重叠对比

先对三个DataFrame做合并处理,新增区域标识字段后绘图:

# 给每个DataFrame新增区域标识
bex_boxdf['area'] = 'Bexley'
west_boxdf['area'] = 'Westminster'
gwch_boxdf['area'] = 'Greenwich'

# 合并三个数据集
import pandas as pd
all_df = pd.concat([bex_boxdf, west_boxdf, gwch_boxdf], axis=0, ignore_index=True)

# 绘图
import seaborn as sns
import matplotlib.pyplot as plt
sns.histplot(
    data=all_df,
    x='month_box',
    weights='Sum Value', # 指定柱子高度为项目数量
    hue='area', # 按区域区分颜色
    multiple='layer', # 开启重叠展示
    bins=range(1,14) # 固定分箱为1-12月
)
plt.legend(prop={'size': 12})
plt.title('不同区域每月犯罪数量对比')
plt.xlabel('月份')
plt.ylabel('犯罪数量')
plt.xticks(range(1,13)) # 确保x轴显示完整1-12月
plt.show()

需求2:展示三个区域项目数量的整体分布差异(不关联月份维度)

直接将项目数量列传入绘图函数即可:

# 注:sns.distplot已在新版本seaborn中弃用,推荐用sns.histplot替代
sns.histplot(bex_boxdf['Sum Value'], kde=False, label = 'Bexley')
sns.histplot(west_boxdf['Sum Value'], kde=False, label = 'Westminster')
sns.histplot(gwch_boxdf['Sum Value'], kde=False, label = 'Greenwich')
plt.legend(prop={'size': 12})
plt.title('犯罪数量分布对比')
plt.xlabel('犯罪数量')
plt.ylabel('频次')
plt.show()

如果你使用的是旧版本seaborn,无法使用histplot,也可以将上述代码中的histplot替换为distplot,核心逻辑不变。

内容的提问来源于stack exchange,提问作者Jimmy K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:54:03