You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:27:39