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

如何在指定时间范围填充两条长度不同的Kaplan-Meier曲线间区域

填充Kaplan-Meier曲线指定时间范围内的区域

由于两条KM曲线的时间点(x轴)不统一,直接填充会因为长度不匹配报错,解决思路是先将两条曲线的生存概率插值到统一的时间序列上,再用polygon()函数填充区域。

以下是完整实现代码:

library(survival)
data(cancer)
# 拟合KM模型
km <- survfit(Surv(time, status) ~ x, data = aml)
# 先绘制基础的KM曲线
plot(km, col = 1:2, main = "KM曲线与填充区域", xlab = "时间", ylab = "生存概率")

# 1. 定义需要填充的时间上限
fill_x_max <- 40

# 2. 生成统一的时间序列:包含两条曲线的所有时间点,且不超过fill_x_max
all_times <- sort(unique(c(km[1]$time, km[2]$time)))
all_times <- all_times[all_times <= fill_x_max]
# 加入0点,保证填充区域从y轴起始位置开始
all_times <- c(0, all_times)

# 3. 对两条曲线的生存概率做线性插值,得到统一时间点对应的surv值
# 曲线1的插值:初始生存概率为1,对应时间0
surv1 <- approx(x = c(0, km[1]$time), y = c(1, km[1]$surv), xout = all_times)$y
# 曲线2的插值
surv2 <- approx(x = c(0, km[2]$time), y = c(1, km[2]$surv), xout = all_times)$y

# 4. 用polygon填充两条曲线之间的区域
# 构造闭合区域的坐标:正序取曲线1的点,逆序取曲线2的点
x_poly <- c(all_times, rev(all_times))
y_poly <- c(surv1, rev(surv2))
polygon(x_poly, y_poly, col = rgb(0.5, 0.5, 1, 0.3), border = NA)

# 可选:添加图例
legend("topright", legend = c(levels(aml$x)[1], levels(aml$x)[2]), 
       col = 1:2, lty = 1, bty = "n")

代码说明

  • approx()函数用于线性插值,解决两条曲线时间点不匹配的问题,保证每个时间点都有对应的生存概率值。
  • polygon()通过连接正序的曲线1和逆序的曲线2形成闭合区域,rgb()参数可自定义填充颜色和透明度(最后一个参数为透明度,0完全透明,1完全不透明)。
  • 加入0点是为了避免填充区域在y轴处出现空白缺口。

内容的提问来源于stack exchange,提问作者Miguel Angel Arnau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:30:58