我使用 ggsurvplot 和以下代码创建了以下生存曲线:
library(survminer)
library(survival)
set.seed(2025)
fakedata <- data.frame(time = rexp(20, rate = log(2)/6), event = sample(x = c(0, 1), size = 20, replace = T, prob = c(0.25, 0.75)))
fakesurv <- survfit(Surv(time, event) ~ 1, data = fakedata)
ggsurvplot(fakesurv, ylab = "Progression-free survival (%)",
xlab = "Time since first treatment (months)",
xlim = c(0,18), break.x.by = 3, conf.int = F,
risk.table = "nrisk_cumcensor", surv.scale = "percent",
tables.y.text = F, legend.title = element_blank(),
legend.labs = "All patients", axes.offset = F)
如您所见,图片有两处错误:曲线的 x 轴与风险表之间的时间点(3、6 等)不匹配,并且整个图片在 18 处被截断几个月,因此该时间点面临风险的数字无法读取。
我只想问第二个问题:原图,这是用假数据重新制作的,只有第二个问题,没有第一个问题。然而现在我也想知道(当然)第一个问题来自哪里。
关于第二个问题:如果将
axes.offset
命令更改为T
,它就会消失。然而此时轴不再在 (0, 0) 处相交。 (我们希望他们这样做,这就是为什么我们在代码中使用 `axes.offset = F。)
这种问题通常可以通过增加主题元素
plot.margin
在 ggplot 中解决。然而, ggsurvplot
的工作方式略有不同,因为 ggsurvplot
对象实际上是列表中的两个 ggplot,并具有自己的绘图方法将它们缝合在一起。因此,您不能仅通过在绘图代码末尾添加 theme()
调用来修改主题元素。
调用
ggsurvplot
时可用的主题选项实际上有点有限。我可能只是创建并存储对象,然后进入并更改我想要修改的位:
p <- ggsurvplot(fakesurv, ylab = "Progression-free survival (%)",
xlab = "Time since first treatment (months)",
xlim = c(0,18), break.x.by = 3, conf.int = F,
risk.table = "nrisk_cumcensor", surv.scale = "percent",
tables.y.text = F, legend.title = element_blank(),
legend.labs = "All patients", axes.offset = F)
p$plot$theme$plot.margin <- ggplot2::margin(10, 50, 10, 10)
p$table$theme$plot.margin <- ggplot2::margin(10, 50, 10, 10)
p$table$coordinates$clip <- "off"
p