首页 > 解决方案 > R:Survminer 双图

问题描述

我参与了一个项目,我们正在为发生率非常低的事件绘制生存曲线,并且 Kaplan-Meier 曲线(使用 绘制survminer)非常平坦。我不想简单地放大 Y 轴,因为我认为发生率可能会被读者误解。显示“真实”率和放大最终微小差异的一种方法是像 NEJM 那样做:

https://www.nejm.org/na101/home/literatum/publisher/mms/journals/content/nejm/2011/nejm_2011.364.issue-9/nejmoa1007432/production/images/img_large/nejmoa1007432_f1.jpeg

但是,我还没有找到直接在survminer. 为了重现性,我想避免涉及任何 Adob​​e 软件。

有谁知道一种方法可以在原始图表顶部包含一个小的放大版本?我想用survminer任何其他好的基于 ggplot 的 KM 包的提示来完成此任务。

小例子:

library(survival)
library(survminer)

df <- genfan
df$treat<-sample(c(0,1),nrow(df),replace=TRUE)
fit <- survfit(Surv(hours, status) ~ treat, data = df)

p <- ggsurvplot(fit, data = df, risk.table = TRUE, fun = 'event', ylim = c(0, 1))
p # Normal flat, singular graph

标签: rsurvival-analysis

解决方案


有几种方法可以做到这一点,但一个建议是制作你拥有的两个地块并用grid.arrange. 首先制作两个地块。然后拉出风险表并为第一个图单独绘制(您不能将 ggsurvplot 对象放在 a 中grid.arrange)。使用 annotation_custom 将第二个绘图嵌套在绘图一中。最后,使用 layout_matrix 指定绘图的尺寸并将其与grid.arrange.

library(survival)
library(survminer)
library(grid)
library(gridExtra)

df <- genfan
df$treat<-sample(c(0,1),nrow(df),replace=TRUE)
fit <- survfit(Surv(hours, status) ~ treat, data = df)

p <- ggsurvplot(fit, data = df, risk.table = TRUE, fun = 'event', ylim = c(0, 1))
#zoomed plot and remove risk table
g <- ggsurvplot(fit, data = df, risk.table = FALSE, fun = 'event', ylim = c(0, .5))

risktab <- p$table

justplot <- p$plot

p2 <- justplot + 
      annotation_custom(grob = ggplotGrob(g$plot+
                            theme(legend.position = "none")),
                             xmin = 60,xmax=Inf,ymin = .5,ymax = Inf)

lay <- rbind(c(1,1),
             c(1,1),
             c(2,2))

gridExtra::grid.arrange(p2, risktab,
                        #use layout matrix to set sizes
                        layout_matrix=lay
)

在此处输入图像描述


推荐阅读