在R中合并日期列与对应息肉大小列并绘制折线图的方法
基于日期横轴的息肉大小折线图绘制方案
你的核心问题是未将日期列与对应息肉大小列关联,现有代码仅处理了大小数据,导致横轴只能显示S1-S5这类分类标签,而非实际日期值。以下是修正后的完整方案:
数据示例
| ID | d1 | d2 | d3 | d4 | d5 | s1 | s2 | s3 | s4 | s5 |
|---|---|---|---|---|---|---|---|---|---|---|
| A | 10 | 14 | 15 | 20 | 23 | 5 | 7 | 10 | 2 | 4 |
解决方案步骤
1. 整理数据为长格式(关联日期与大小)
推荐使用tidyr包的pivot_longer函数(当前tidyverse生态的推荐方法),也可以用reshape2的melt实现:
方法1:tidyr(推荐)
library(tidyr) library(ggplot2) # 将宽格式数据转换为长格式,匹配日期与对应大小 df_long <- df %>% # 处理日期列 pivot_longer(cols = starts_with("d"), names_to = "time_tag", values_to = "date") %>% # 处理大小列 pivot_longer(cols = starts_with("s"), names_to = "size_tag", values_to = "polyp_size") %>% # 匹配对应时间点(d1对应s1,以此类推) filter(substr(time_tag, 2, 2) == substr(size_tag, 2, 2)) %>% # 保留需要的列 select(ID, date, polyp_size)
方法2:reshape2
library(reshape2) library(ggplot2) # 分别融化日期和大小列 df_dates <- melt(df, id.vars = "ID", measure.vars = c("D1","D2","D3","D4","D5"), variable.name = "time_tag", value.name = "date") df_sizes <- melt(df, id.vars = "ID", measure.vars = c("S1","S2","S3","S4","S5"), variable.name = "size_tag", value.name = "polyp_size") # 合并并匹配对应时间点 df_long <- cbind(df_dates, df_sizes$polyp_size) colnames(df_long)[4] <- "polyp_size"
2. 绘制折线图
用整理后的长格式数据绘图,横轴即为实际日期值:
ggplot(df_long, aes(x = date, y = polyp_size, group = ID, colour = ID)) + geom_line(alpha = 0.1) + labs(x = "日期", y = "息肉大小(mm)") + ggtitle("不同日期的息肉大小(mm) (n=1973)") + guides(colour = FALSE)
说明
整理后的数据中,每一行对应一个患者的一个时间点(日期+息肉大小),ggplot可正确以日期为横轴绘制折线,直观反映息肉大小随实际日期的变化趋势。
内容的提问来源于stack exchange,提问作者Anisha
相关产品推荐
相关产品推荐

