Customising line type in adjusted survival curves ggadjustedcurves (survminer, ggplot2)

北慕城南 提交于 2020-12-12 09:44:36

问题


I'm trying to plot an adjusted survival curve, but struggling with changing the line types by group. I'm able to customise other aspects of the plot using typical ggplot2 language, but I've hit a wall with changing line type.

Example:

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)

I've tried adding in:

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

and just

linetype = c(1, 2)

but nothing seems to work.


回答1:


First you need to look at the code.

ggadjustedcurves

It appears that ggadjustedcurves passes all it arguments on to helper functions that depend on the "method" argument, in this case "average", so now look at that (hidden) function:

 getAnywhere( ggadjustedcurves.average )

And note that there is no provision to accept additional arguments beyond the few that are defined in the "master function", i.e. no use of R's ellipsis mechanism or specifications of other possible aes-arguments besides size. (It's also not using geom_line.) So you need to change both the master function and the helper function to accept a "linetype" argument. Here I show how to modify the helper function (although this needs to be done to the ggadjustedcurves function as well and maybe the rest of the helper functions if you want this to be completely general):

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")

If you do an SO search on "geom_segment linetype" you find that geom_segment (which is what geon_step uses) is not constructed in a manner that makes it easy to give it short vectors to modify "contiguous" lengths of step function results. See ggplot error using linetype and group aesthetics . This means you would need to use a for-loop or lapply to build separate "step-curves" if you need different line types.



来源:https://stackoverflow.com/questions/56582928/customising-line-type-in-adjusted-survival-curves-ggadjustedcurves-survminer-g

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!