如何基于DataFrame生成按小时与星期划分的死亡率热力图?
解决方案:绘制车祸死亡率热力图(小时×星期)
核心思路
你需要的是小时与星期组合维度的死亡率数据,而非单独小时或星期的统计值。下面是从数据计算到绘图的完整流程:
步骤1:计算每个(星期+小时)组合的死亡率
# 按星期和小时分组,分别统计致命、非致命车祸数量 fatal_counts = df[df.Fatal == 1].groupby(['Day of the Week', 'Hour of Day']).Fatal.count() non_fatal_counts = df[df.Fatal == 2].groupby(['Day of the Week', 'Hour of Day']).Fatal.count() # 计算组合维度的死亡率(转换为百分比) mortality_rates = (fatal_counts / (fatal_counts + non_fatal_counts) * 100).reset_index()
步骤2:转换为热力图所需的二维矩阵
热力图需要行(星期)×列(小时)的结构化数据,用透视表完成转换:
# 生成透视表,行=星期,列=小时,值=死亡率 heatmap_data = mortality_rates.pivot( index='Day of the Week', columns='Hour of Day', values='Fatal' ) # 填充缺失值(部分组合可能无车祸记录,用0替代) heatmap_data = heatmap_data.fillna(0)
步骤3:绘制热力图
使用Seaborn库完成可视化:
import seaborn as sns import matplotlib.pyplot as plt # 配置绘图参数 sns.set(font_scale=1.2) plt.figure(figsize=(16, 8)) # 绘制热力图,显示数值,设置配色和色标标签 ax = sns.heatmap( heatmap_data, annot=True, fmt='.2f', cmap='YlOrRd', cbar_kws={'label': '死亡率 (%)'} ) # 设置轴标签和标题 ax.set_xlabel('一天中的小时') ax.set_ylabel('星期几') ax.set_title('车祸死亡率热力图(星期×小时)') # 优化Y轴标签显示(避免旋转) ax.set_yticklabels(ax.get_yticklabels(), rotation=0) plt.show()
可选优化
- 若需将星期数值替换为中文名称,可修改Y轴标签:
ax.set_yticklabels(['周一', '周二', '周三', '周四', '周五', '周六', '周日']) - 可更换配色方案,比如
cmap='viridis'或cmap='Blues',适配不同视觉需求。
内容的提问来源于stack exchange,提问作者MB2000
相关产品推荐
相关产品推荐

