Я создаю кривые Калпана-Мейера, стратифицированные по лечению и стадии. Я хотел бы заштриховать область между кривыми, принадлежащими одному и тому же этапу.
Например, если я импортирую данные из пакета выживания:
data(pbc, package = "survival")
И я генерирую кривые Каплана-Мейера, используя survfit и ggsurvplot:
survminer::ggsurvplot(survival::survfit(survival::Surv(time=time/365, event=status==2) ~ trt + stage,
data=pbc),
palette=c("red", "blue", "green", "orange",
"red", "blue", "green", "orange"))
Рисунок выше выглядит следующим образом:
Я хотел бы заштриховать область между лечением 1 и 2 для этапа 1 (красные линии), лечением 1 и 2 для этапа 2 (синие линии) и т. д.
Есть какие-нибудь советы о том, как это сделать?
Спасибо!





Одним из вариантов может быть использование geom_polygon, который сначала требует дублирования наблюдений, в которых происходит этот шаг, а затем расположит данные в правильном порядке, т. е. расположит одну группу лечения по времени, а вторую — в обратном порядке.
Примечание. «Нулевой» шаг, конечно, заключается в получении данных для кривых выживания, которые я получаю из элемента plot объекта ggsurvplot через layer_data. Другой подход — использовать данные, предоставленные в элементе data.survplot. Это экономит некоторые шаги по подготовке данных, но потребует добавления цветов с использованием дополнительной шкалы заливки.
library(tidyverse)
dat <- p$plot |>
layer_data() |>
arrange(colour, group) |>
mutate(trt = consecutive_id(group), .by = colour) |>
select(stage = colour, trt, time = x, surv = y)
dat_step <- dat |>
arrange(stage, trt, time) |>
mutate(surv_lag = lag(surv, default = 1)) |>
filter(surv_lag > surv, .by = c(stage, trt)) |>
mutate(surv = surv_lag, .keep = "unused")
dat <- bind_rows(dat, dat_step) |>
split(~stage) |>
lapply(\(x) {
bind_rows(
x |> filter(trt == 1) |> arrange(time, desc(surv)),
x |> filter(trt == 2) |> arrange(desc(time), surv)
)
}) |>
bind_rows()
p$plot +
geom_polygon(
data = dat,
aes(time, surv, fill = I(stage)),
alpha = .2
)

Большое спасибо!
Похоже, что для построения этого плана выживания существует множество встроенных предположений. Один из способов — сохранить объект графика и извлечь элемент данных, а затем воссоздать данные вне этой функции построения графика.