在调整后的生存曲线ggadjustedcurves(survminer,ggplot2)中自定义线型

时间:2019-06-13 14:37:08

标签: r ggplot2 survival-analysis cox-regression survival

我正在尝试绘制一条调整后的生存曲线,但努力按组更改线型。我可以使用典型的ggplot2语言自定义绘图的其他方面,但是我遇到了线型变化的问题。

示例:

library(survival)
library(survminer)

fit2 <- coxph( Surv(stop, event) ~ size + strata(rx), data = bladder )

ggadjustedcurves(fit2,
                 variable = "rx", 
                 data = bladder,
                 method = "average",
                 palette = c("#E69F00", "#56B4E9"),
                 size = 1.3,
                 legend = "right",
                 legend.title = expression(bold("Legend title")),
                 xlab = "Time",
                 font.legend = 12) +
  theme(legend.text.align = 0.5)

我尝试添加:

geom_line( aes( linetype = c(1, 2) )
add.params = list(linetype = c(1, 2))

还有

linetype = c(1, 2)

,但似乎没有任何效果。

1 个答案:

答案 0 :(得分:0)

首先,您需要查看代码。

ggadjustedcurves

看来ggadjustedcurves将其所有参数传递给依赖于“方法”参数(在本例中为“平均值”)的辅助函数,因此现在来看一下(隐藏的)函数:

 getAnywhere( ggadjustedcurves.average )

请注意,除了“主函数”中定义的少数几个参数外,没有任何规定可以接受其他参数,即除了大小以外,不使用R的省略号机制或其他可能的aes参数的规范。 (它也不使用geom_line。)因此,您需要同时更改主功能和辅助功能的 和辅助功能,以接受“线型”参数。在这里,我展示了如何修改辅助函数(尽管也需要对ggadjustedcurves函数进行此操作,如果您希望它完全通用,也可以对其他辅助函数进行此操作):

assignInNamespace('ggadjustedcurves.average',  

  function (data, fit, variable, size = 1, ..., linetype=linetype) 
    {
    time <- surv <- NULL
    lev <- sort(unique(data[, variable]))
    pred <- survexp(as.formula(paste("~", variable)), data = data, 
                    ratetable = fit)
    curve <- data.frame(time = rep(c(0, pred$time), length(lev)), 
                        variable = factor(rep(lev, each = 1 + length(pred$time))), 
                        surv = c(rbind(1, pred$surv)))
    ggplot(curve, aes(x = time, y = surv, color = variable)) + 
        geom_step(size = size, ..., linetype=linetype)  # not geom_line
    }, 
   pos="package:survminer")

enter image description here

如果您对“ geom_segment线型”进行SO搜索,则会发现geom_segmentgeon_step所使用的)的构造方式不容易使短向量修改阶跃函数结果的“连续”长度。参见ggplot error using linetype and group aesthetics。这意味着如果需要不同的线型,则需要使用for-looplapply来构建单独的“阶梯曲线”。