技术求助:使用ggplot2绘制按年龄展示事件序列的折线图
需求:绘制事件序列轨迹图
现有如下df数据集,包含不同的事件序列,以及事件发生时个体的年龄(A:E)。若某事件未发生,对应列值为NA。序列的占比存储在prop列中:
df <- data.frame(seq_id = seq(1,5), seq = as.character(c("A>B>D", "A>B", "A>D>B", "A>C>E", "A>B>E")), prop = sample(seq(5,50), 5, replace=T), A = c(41,38,60,45,47), B = c(42,40,68,NA,52), C = c(NA,NA,NA,50,NA), D = c(45,NA,62,NA,NA), E = c(NA,NA,NA,78,80) ) df #> seq_id seq prop A B C D E #> 1 1 A>B>D 13 41 42 NA 45 NA #> 2 2 A>B 8 38 40 NA NA NA #> 3 3 A>D>B 35 60 68 NA 62 NA #> 4 4 A>C>E 5 45 NA 50 NA 78 #> 5 5 A>B>E 37 47 52 NA NA 80
希望绘制轨迹图,要求每条轨迹仅显示实际发生的事件,呈现类似折线轨迹的样式。
解决方案
可以用tidyverse工具链(dplyr+tidyr+ggplot2)实现,核心步骤:
- 数据转换:将宽格式数据转为长格式,过滤未发生的事件(
NA值),同时从seq列提取事件顺序,保证轨迹走向符合真实序列 - 绘图:按序列分组绘制轨迹,以年龄为横轴、事件为纵轴,还可通过
prop列调整轨迹粗细,体现序列的占比权重
完整代码:
library(tidyverse) # 数据预处理:宽转长+过滤无效数据+排序事件 df_long <- df %>% pivot_longer(cols = A:E, names_to = "event", values_to = "age") %>% drop_na(age) %>% mutate( # 提取当前序列的事件顺序,用于排序 event_order = str_split(seq, ">")[[1]] %>% match(event) ) %>% arrange(seq_id, event_order) # 绘制轨迹图 ggplot(df_long, aes(x = age, y = event, group = seq_id)) + geom_line(aes(size = prop), alpha = 0.7) + geom_point(size = 3) + labs(x = "年龄", y = "事件", title = "事件序列轨迹图") + theme_minimal() + scale_size(range = c(0.5, 2)) # 调整线宽范围,可按需修改
关键细节说明:
pivot_longer:把分散在A-E列的年龄数据整合为event(事件)和age(年龄)两列,便于绘图分组drop_na(age):直接剔除未发生的事件,确保每条轨迹只展示实际发生的事件节点event_order:根据seq列的事件序列给每个事件分配顺序值,避免绘图时轨迹连接顺序混乱size = prop:让占比更高的序列轨迹更粗,可视化上突出更常见的事件路径
内容的提问来源于stack exchange,提问作者Nao
相关产品推荐
相关产品推荐

