如何在R中为同分期的分层Kaplan-Meier曲线间区域着色?
实现同分期Kaplan-Meier曲线间区域着色的方法
ggsurvplot没有直接支持同分期不同治疗方案曲线间区域着色的功能,我们可以通过提取生存曲线数据,结合ggplot2手动实现该效果:
步骤1:拟合生存曲线并提取数据
先完成模型拟合,再将生存曲线的结果转换为可操作的数据框:
library(survival) library(ggplot2) library(dplyr) library(broom) # 导入数据集 data(pbc, package="survival") # 拟合分层生存曲线 fit <- survfit(Surv(time=time/365, event=status==2) ~ trt + stage, data=pbc) # 提取曲线数据并拆分分组变量 surv_data <- tidy(fit) %>% separate(strata, into = c("trt", "stage"), sep = ", ") %>% mutate( trt = gsub("trt=", "", trt), stage = gsub("stage=", "", stage), trt = as.factor(trt) )
步骤2:整理填充区域所需数据
按分期和时间点分组,提取每个时间点上两条治疗方案曲线的生存概率范围:
fill_data <- surv_data %>% group_by(stage, time) %>% summarise( surv_min = min(surv), surv_max = max(surv), .groups = "drop" ) %>% filter(!is.na(surv_min) & !is.na(surv_max))
步骤3:绘制曲线并添加区域填充
用ggplot2先绘制填充区域,再叠加KM曲线,保证曲线可见:
# 定义分期对应的颜色,和原示例配色一致 color_pal <- c("1" = "red", "2" = "blue", "3" = "green", "4" = "orange") ggplot() + # 添加同分期曲线间的填充区域,设置半透明避免遮挡曲线 geom_ribbon(data = fill_data, aes(x = time, ymin = surv_min, ymax = surv_max, fill = stage), alpha = 0.2) + # 绘制KM曲线,用线型区分治疗方案 geom_step(data = surv_data, aes(x = time, y = surv, color = stage, linetype = trt), linewidth = 1) + # 配置颜色映射 scale_color_manual(values = color_pal) + scale_fill_manual(values = color_pal) + # 设置标签和主题 labs(x = "时间(年)", y = "生存概率", color = "分期", fill = "分期", linetype = "治疗方案") + theme_minimal()
补充说明
- 若需要更精准的曲线配对,可按分期单独筛选数据后再合并填充数据
- 调整
alpha参数可改变填充区域的透明度,平衡视觉效果和曲线可读性
内容的提问来源于stack exchange,提问作者C. Maas
相关产品推荐
相关产品推荐

