如何创建双变量并列条形图?基于DataFrame实现小时维度对比
解决方案
1. 数据预处理
方式一:按小时直接聚合
先把hour转为字符串类型(作为分类变量),避免绘图时被当作连续数值处理,再按小时分组求和:
import pandas as pd # 假设你的DataFrame名为df df['hour'] = df['hour'].astype(str) # 按小时聚合Victims和Deaths的总量 hourly_totals = df.groupby('hour')[['Victims', 'Deaths']].sum().reset_index()
方式二:按昼夜(Diurno/Nocturno)分组
先定义昼夜划分规则(比如白天Diurno为6-18点,夜间Nocturno为19-5点),再分组聚合:
# 添加昼夜分组列 df['day_night'] = pd.cut(df['hour'], bins=[-1,5,18,23], labels=['Nocturno', 'Diurno', 'Nocturno']) # 按昼夜分组求和 day_night_totals = df.groupby('day_night')[['Victims', 'Deaths']].sum().reset_index()
2. 绘制分组柱状图
用Seaborn绘制类似目标样式的分组柱状图,每个类别(小时/昼夜)对应两个对比柱子:
import seaborn as sns import matplotlib.pyplot as plt # 设置绘图风格 sns.set_style("whitegrid") # 选择用小时维度数据,若用昼夜则替换为day_night_totals plot_data = hourly_totals.melt(id_vars='hour', var_name='Metric', value_name='Total') # 绘制分组柱状图 plt.figure(figsize=(12,6)) sns.barplot(x='hour', y='Total', hue='Metric', data=plot_data, palette='Set2') # 添加标题和标签 plt.title('每小时受害者与死亡数总量对比', fontsize=14) plt.xlabel('小时', fontsize=12) plt.ylabel('总量', fontsize=12) plt.legend(title='指标') plt.show()
关键说明
- 将
hour转为字符串是为了让它作为离散分类变量,确保绘图时只显示存在的小时值 - 使用
melt函数把宽表转为长表,适配Seaborn分组柱状图的输入格式 - 若要调整样式,可修改
palette(颜色)、figsize(图表尺寸)等参数
内容的提问来源于stack exchange,提问作者Alejandra Ezcurra
相关产品推荐
相关产品推荐

