I'm trying to plot survival curves for a corresponding analysis using survminer & survival packages. Setting risk.table = TRUE in the ggsurvplot command results in a warning saying 'Vectorized input to element_text() is not officially supported. Results may be unexpected or may change in future versions of ggplot2.'
I also tried whether this issue occurs with other data which it does. Here's a simple reprex I ran on R version 4.0.3, Rstudio Version 1.2.5033:
library('survival')
library('survminer')
library('ggplot2')
lung <- survival::lung
fit<- survfit(Surv(time, status) ~ sex, data = lung)
ggsurvplot(fit, data = lung, risk.table = TRUE)
The warning doesn't occur if risk.table = FALSE which is why I assume that the risktables argument somehow interferes with the ggplot2 x-axis formatting. In a discussion on github about whether vectorized input to element_text() should be supported in the future of ggplot2, developers seem to rather opt for a deprecation cycle https://github.com/tidyverse/ggplot2/issues/3492.
I was wondering if there currently is some way to overcome this issue since I would want to make regular use of ggsurvplot and its risktables feature in the future. The issue also seems to occur for other plots created with ggplot2 (see github discussion above). However, in the reprex, it seems to be related to an inherent argument of ggsurvplot which to me seems critical for future use of this function. Any supportive input would be highly appreciated.
Here is a workaround to get the information from the risk.table feature and present it (and a little more information) next to the survival plot. I guess until the issue is solved by the authors that's the best we can do about it for now.
library('survival')
library('survminer')
library('ggplot2')
library('kableExtra')
# Specify dataset
lung <- survival::lung
fit<- survfit(Surv(time, status) ~ sex, data = lung)
# -----------Scenario 1: KM-plot and risk.table without writing a function
kmplot <- ggsurvplot(fit, data = lung, risk.table = FALSE)
risktable <- kmplot$data.survtable
# Using R Markdown: Setting results='asis' in the corresponding chunk header - knit to html
## Output KM-plot
kmplot
## Output risktable
print (
kable(risktable, caption = paste("Survival stratified by sex")) %>%
column_spec(1, bold = T) %>%
kable_styling(bootstrap_options = "hover", full_width = TRUE))
# -----------Scenario 2: Using a function
fun_surv <- function (x) {
kmplot <- ggsurvplot(x, data = lung, risk.table = FALSE)
risktable <- kmplot$data.survtable
list_surv <- list(kmplot, risktable)
list_surv
}
res_surv <- fun_surv(fit)
# Using R Markdown: Setting results='asis' in the corresponding chunk header - knit to html
## Output KM-plot
res_surv[[1]]
## Output risktable
print (
kable(res_surv [[2]], caption = paste("Survival stratified by sex")) %>%
column_spec(1, bold = T) %>%
kable_styling(bootstrap_options = "hover", full_width = TRUE))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With