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
相关产品推荐
相关产品推荐

