统计各伤害原因月度事件频次并绘制多线折线图的实现方法
实现方案
你需要先按季度(每3个月)聚合统计各伤害原因的发生频次,再基于统计结果绘图即可,以下分别提供R和Python的实现代码:
R 实现方案
1. 数据预处理
# 加载依赖包 library(tidyverse) library(lubridate) # 预处理:转换日期格式、生成季度维度、清理异常分类值 df_clean <- df %>% mutate( Injury.Date.Time = ymd_hms(Injury.Date.Time), # 按季度向下取整,生成统一的季度时间标签 quarter = floor_date(Injury.Date.Time, unit = "quarter"), # 清理伤害原因的空格和异常输入,比如示例中的"Motor Vehicleter"修正为标准值 Injury.Cause = str_squish(Injury.Cause), Injury.Cause = case_when( str_detect(Injury.Cause, "Motor Vehicle") ~ "Motor Vehicle", TRUE ~ Injury.Cause ) )
2. 按季度统计各伤害类型频次
# 生成长表统计结果,可直接用于绘图 df_quarter_stat <- df_clean %>% group_by(quarter, Injury.Cause) %>% summarise(freq = n(), .groups = "drop") # 若需要你提到的宽表格式,执行以下转换即可 df_wide <- df_quarter_stat %>% pivot_wider(names_from = Injury.Cause, values_from = freq, values_fill = 0)
3. 绘制多线折线图
ggplot(df_quarter_stat, aes(x = quarter, y = freq, color = Injury.Cause, group = Injury.Cause)) + geom_line(linewidth = 1) + geom_point(size = 2) + # X轴按3个月为间隔展示,标签格式为 年份+季度 scale_x_date(date_breaks = "3 months", date_labels = "%Y Q%q") + labs(x = "时间(季度)", y = "发生频次", color = "伤害原因") + theme_bw()
Python 实现方案
1. 数据预处理
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 转换日期格式 df['Injury.Date.Time'] = pd.to_datetime(df['Injury.Date.Time']) # 生成季度标签 df['quarter'] = df['Injury.Date.Time'].dt.to_period('Q').dt.to_timestamp() # 清理伤害原因异常值 df['Injury.Cause'] = df['Injury.Cause'].str.strip() df.loc[df['Injury.Cause'].str.contains('Motor Vehicle'), 'Injury.Cause'] = 'Motor Vehicle'
2. 按季度统计频次
# 统计各季度各伤害类型的频次 df_quarter_stat = df.groupby(['quarter', 'Injury.Cause']).size().reset_index(name='freq') # 转换为宽表的代码 df_wide = df_quarter_stat.pivot(index='quarter', columns='Injury.Cause', values='freq').fillna(0).reset_index()
3. 绘制多线折线图
plt.figure(figsize=(12, 6)) sns.lineplot(data=df_quarter_stat, x='quarter', y='freq', hue='Injury.Cause', marker='o', linewidth=2) # X轴按3个月间隔设置刻度 plt.xticks(pd.date_range(start=df_quarter_stat['quarter'].min(), end=df_quarter_stat['quarter'].max(), freq='3M'), rotation=45) plt.xlabel('时间(季度)') plt.ylabel('发生频次') plt.legend(title='伤害原因') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Ram6
相关产品推荐
相关产品推荐

