如何用ggplot2在R中绘制单实体多字段的转置多折线图
绘制单实体多字段时序多折线图(匹兹堡EMS呼叫场景)
要实现单实体(匹兹堡)下多字段(不同EMS呼叫原因)的时序折线图,核心是将宽格式数据转换为长格式——这是和常规多实体折线图的本质区别。下面用你提供的tibble和工具包给出具体实现方案:
1. 数据重塑(宽转长)
你的当前数据是宽格式(每个呼叫原因对应一列),而ggplot2绘制多折线图需要长格式(一个列存储呼叫原因类别,一个列存储对应呼叫数量)。
方法1:用tidyverse的tidyr::pivot_longer(推荐,原生兼容tidyverse)
利用你已定义的vec_col.names指定需要转换的列:
library(tidyverse) # 宽转长 df_long <- df_0 %>% pivot_longer( cols = all_of(vec_col.names), # 用预定义的列名向量指定转换列 names_to = "call_reason", # 新列:存储呼叫原因类别 values_to = "call_count" # 新列:存储对应呼叫数量 )
方法2:用reshape2的melt(你提到的工具包)
如果你更习惯用reshape2,也可以这样转换:
library(reshape2) df_long <- melt( df_0, id.vars = c("City_name", "year_quarter"), # 保留的非度量列 measure.vars = vec_col.names, # 需要转换的度量列 variable.name = "call_reason", # 类别列名 value.name = "call_count" # 数值列名 )
转换后的长格式数据结构示例:
# A tibble: 24 × 4 City_name year_quarter call_reason call_count <chr> <chr> <chr> <dbl> 1 PITTSBURGH 2015Q1 ABDOMINAL_PAIN 10 2 PITTSBURGH 2015Q1 ALLERGIES 12 3 PITTSBURGH 2015Q1 ASSAULT 14 4 PITTSBURGH 2015Q1 BACK_PAIN 16 ...
2. 绘制多折线图
用ggplot2绘制,按call_reason区分不同折线,year_quarter作为X轴,call_count作为Y轴:
ggplot(df_long, aes(x = year_quarter, y = call_count, color = call_reason, group = call_reason)) + geom_line(linewidth = 1) + # 绘制折线,设置线宽 geom_point(size = 2) + # 添加数据点,增强可读性 labs( title = "匹兹堡EMS不同呼叫原因季度数量变化", x = "季度", y = "呼叫数量", color = "呼叫原因" ) + theme_minimal() + # 使用简洁主题 theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转X轴标签避免重叠
3. 可选优化
- 如果
year_quarter需要按时间顺序排序,可以先将其转换为时间类型:
这样X轴会自动按时间顺序排列,无需手动调整。df_long <- df_long %>% mutate(year_quarter = as.yearqtr(year_quarter, format = "%YQ%q")) - 可以自定义折线颜色,比如用
scale_color_manual()指定颜色向量。
内容的提问来源于stack exchange,提问作者user25049371
相关产品推荐
相关产品推荐

