UseMethod("grid.draw") 中的 ggsave 错误:没有适用于 'grid.draw' 的方法应用于类“c('ggsurvplot', 'ggsurv', 'list')”的对象

Ang*_*eek 5 survminer ggsave

所以我使用生存曲线制作了 ggplot。

Wolcurves <- survfit(Surv(Days, Survival) ~ Wol, data = DCV_noPBS)
IFB_plot <- ggsurvplot(Wolcurves, data = DCV_noPBS,
                       line = c(2, 1),
                       pval = "p-value = 0", 
                       xlab = "Time in days",
                       ylab = "Proportional survival",
                       break.time.by = 1,
                       break.y.by = 0.2,
                       legend.labs = c("w1118wMel-Tet", "w1118wMel"))
Run Code Online (Sandbox Code Playgroud)

我用下面的代码遇到了这个错误。

ggsave(filename = "results/IFB2.pdf", plot = IFB_plot,
       width = 12, height = 10, dpi = 1000, units = "cm")
Run Code Online (Sandbox Code Playgroud)

Error in UseMethod("grid.draw") : no applicable method for 'grid.draw' applied to an object of class "c('ggsurvplot', 'ggsurv', 'list')"

如果我不指定绘图参数并仅保存默认的最新绘图,它就可以正常工作。

小智 2

看起来该survminer包创建了一个可以使用的 grob 对象ggsave,但随后它变成了一个不起作用的自定义列表对象。我使用他们的内部函数来解决这个问题! https://github.com/kassambara/survminer/blob/54f0564a3bdc13441d0b6859bf0a1a6753b45684/R/ggsurvplot.R

以下是适合您情况的解决方案!也许处理该包的人有更好的解决方案来添加保存选项。

Wolcurves <- survfit(Surv(Days, Survival) ~ Wol, data = DCV_noPBS)
IFB_plot <- ggsurvplot(Wolcurves, data = DCV_noPBS, line = c(2, 1), pval = "p-value = 0",
                       xlab = "Time in days", ylab = "Proportional survival",
                       break.time.by = 1, break.y.by = 0.2,
                       legend.labs = c("w1118wMel-Tet", "w1118wMel"))

ggsave_workaround <- function(g){survminer:::.build_ggsurvplot(x = g,
                                                               surv.plot.height = NULL,
                                                               risk.table.height = NULL,
                                                               ncensor.plot.height = NULL)}

g_to_save <- ggsave_workaround(IFB_plot)

ggsave(filename = "results/IFB2.pdf", plot = g_to_save,
       width = 12, height = 10, dpi = 1000, units = "cm")
Run Code Online (Sandbox Code Playgroud)