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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:12:43