如何使用ggsurvplot在同图展示总人群及亚组KM生存曲线?
用ggsurvplot同时展示总人群与亚组KM生存曲线
直接分别拟合总人群和亚组的生存模型,再通过ggplot图层合并的方式将总人群曲线添加到亚组图中,具体步骤如下:
1. 加载依赖包
library(survival) library(survminer)
2. 拟合生存模型
以自带的lung数据集为例,亚组按sex划分:
# 总人群生存模型(无分组变量) fit_total <- survfit(Surv(time, status) ~ 1, data = lung) # 亚组生存模型(按sex分组) fit_subgroup <- survfit(Surv(time, status) ~ sex, data = lung)
3. 绘制亚组曲线并添加总人群参考线
先绘制亚组的生存曲线,再将总人群曲线以虚线形式叠加:
# 基础亚组生存曲线 p <- ggsurvplot(fit_subgroup, data = lung, palette = c("#E7B800", "#2E9FDF"), # 亚组颜色 legend.title = "Subgroup", legend.labs = c("Male", "Female"), risk.table = TRUE, # 可选:添加风险表 ggtheme = theme_bw()) # 提取总人群生存数据并添加曲线 total_surv_df <- fortify(fit_total) p$plot <- p$plot + geom_step(data = total_surv_df, aes(x = time, y = surv), color = "#FC4E07", linetype = "dashed", size = 1) + # 统一图例设置,区分亚组与总人群 scale_color_manual(name = "Groups", values = c("#E7B800", "#2E9FDF", "#FC4E07"), labels = c("Male", "Female", "Total Population")) + scale_linetype_manual(name = "Groups", values = c("solid", "solid", "dashed"), labels = c("Male", "Female", "Total Population")) + # 调整图例位置避免重叠 theme(legend.position = "bottom") # 输出最终图 print(p)
关键说明
ggsurvplot返回的是包含plot(ggplot对象)的列表,因此可以直接通过p$plot添加ggplot图层- 用
fortify()将survfit对象转换为数据框,方便ggplot调用 - 通过颜色、线型区分总人群与亚组,确保视觉上清晰区分
- 如果不需要风险表,去掉
risk.table = TRUE即可
内容的提问来源于stack exchange,提问作者Buttercup
相关产品推荐
相关产品推荐

