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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:16:07