如何在R/ggplot2中为每位患者绘制配对x-y散点/折线图?
在R/ggplot2中按患者绘制配对散点/折线图
需求说明
希望为每位患者创建一个散点/折线图系列,其中x轴为术后天数(Controll_Days_n),y轴为对应百分比(Controll_Percent_n),同编号的Controll_Percent_n与Controll_Days_n为一组配对数据。样本数据如下:
Patient ID 1 2 Controll_Percent_1 0.000 0.000 Controll_Percent_2 0.035 0.000 Controll_Percent_3 0.035 0.039 Controll_Percent_4 0.053 0.053 Controll_Percent_5 0.088 0.066 Controll_Percent_6 0.088 0.066 Controll_Percent_7 0.105 0.092 Controll_Percent_8 0.123 0.171 Controll_Percent_9 0.158 0.263 Controll_Percent_10 0.158 0.224 Controll_Percent_11 0.197 Controll_Percent_12 0.211 Controll_Percent_13 0.276 Controll_Percent_14 Controll_Percent_15 Controll_Percent_16 Controll_Percent_17 Controll_Days_1 33 32 Controll_Days_2 378 128 Controll_Days_3 575 502 Controll_Days_4 951 633 Controll_Days_5 1127 800 Controll_Days_6 1324 853 Controll_Days_7 1512 999 Controll_Days_8 1887 1122 Controll_Days_9 2141 1312 Controll_Days_10 2331 1467 Controll_Days_11 1657 Controll_Days_12 2022 Controll_Days_13 2393 Controll_Days_14 Controll_Days_15 Controll_Days_16
解决方案
核心是先将宽格式数据转换为ggplot2所需的长格式,再按患者分组绘图,具体步骤如下:
1. 数据导入与预处理
先构造样本数据框(若数据来自外部文件,可替换为read.csv()等读取函数),然后拆分指标类型、配对x/y数据:
# 构造样本数据框 df <- data.frame( Metric = c( "Controll_Percent_1", "Controll_Percent_2", "Controll_Percent_3", "Controll_Percent_4", "Controll_Percent_5", "Controll_Percent_6", "Controll_Percent_7", "Controll_Percent_8", "Controll_Percent_9", "Controll_Percent_10", "Controll_Percent_11", "Controll_Percent_12", "Controll_Percent_13", "Controll_Percent_14", "Controll_Percent_15", "Controll_Percent_16", "Controll_Percent_17", "Controll_Days_1", "Controll_Days_2", "Controll_Days_3", "Controll_Days_4", "Controll_Days_5", "Controll_Days_6", "Controll_Days_7", "Controll_Days_8", "Controll_Days_9", "Controll_Days_10", "Controll_Days_11", "Controll_Days_12", "Controll_Days_13", "Controll_Days_14", "Controll_Days_15", "Controll_Days_16" ), Patient_1 = c( 0.000, 0.035, 0.035, 0.053, 0.088, 0.088, 0.105, 0.123, 0.158, 0.158, 0.197, 0.211, 0.276, NA, NA, NA, NA, 33, 378, 575, 951, 1127, 1324, 1512, 1887, 2141, 2331, 1657, 2022, 2393, NA, NA, NA ), Patient_2 = c( 0.000, 0.000, 0.039, 0.053, 0.066, 0.066, 0.092, 0.171, 0.263, 0.224, NA, NA, NA, NA, NA, NA, NA, 32, 128, 502, 633, 800, 853, 999, 1122, 1312, 1467, NA, NA, NA, NA, NA, NA ) ) # 拆分指标类型和编号 df$Type <- gsub("_\\d+$", "", df$Metric) df$ID <- as.integer(gsub("^.*_", "", df$Metric)) # 转换为长格式并配对x/y数据 library(tidyr) long_df <- pivot_longer(df, cols = starts_with("Patient_"), names_to = "Patient", values_to = "Value") long_df$Patient <- gsub("Patient_", "", long_df$Patient) final_df <- pivot_wider(long_df, names_from = "Type", values_from = "Value") final_df <- na.omit(final_df) # 移除缺失值行
2. 使用ggplot2绘制散点+折线图
整理后的数据已按患者、时间点配对好x/y值,直接分组绘图:
library(ggplot2) ggplot(final_df, aes(x = Controll_Days, y = Controll_Percent, color = Patient)) + geom_point(size = 3) + # 添加散点 geom_line(linewidth = 1) + # 添加折线 labs( title = "术后天数与对应百分比变化", x = "术后天数", y = "百分比", color = "患者ID" ) + theme_minimal() + theme(plot.title = element_text(hjust = 0.5))
关键说明
- 数据转换:通过
tidyr的pivot_longer和pivot_wider完成宽长格式转换,将分散的天数和百分比数据配对到同一行,保留患者和时间点标识。 - 绘图逻辑:用
color = Patient指定按患者分组着色,同时叠加散点和折线,清晰展示每个患者的术后变化趋势。
内容的提问来源于stack exchange,提问作者Asdax
相关产品推荐
相关产品推荐

