The ggsurvplot function from the package survminer allows users to draw Kaplen-Meier curves. It also allows us to create a table beneath the plot with the number of censored observations by configuring the ncensor.plot value. My question is: how does one change the y-axis of the censored table beneath the plot? The reason is I have a study termination at for example 52 weeks, and therefore the amount of censored observations is high, skewing the table completely. See the example below.
#Create a random dataset with gender, event, time
set.seed(100)
time <- rnorm(n = 100, mean = 52, sd = 20)
set.seed(150)
gender <- sample(x = c(0, 1), prob = c(.6, .4), size = 100, replace = TRUE)
set.seed(100)
event <- sample(x = c(0, 1), prob = c(.4, .6), size = 100, replace = TRUE)
dat <- data.frame(time, gender, event)
#Censor time after 52 weeks
dat <- dat %>% mutate(time_adjusted = if_else(time > 52, 52, time))
#KM-estimator
survObject <- Surv(time = dat$time_adjusted, event = dat$event)
km.model <- survfit(survObject ~ gender, data = dat)
summary(km.model)
Call: survfit(formula = survObject ~ gender, data = dat)
gender=0
time n.risk n.event survival std.err lower 95% CI upper 95% CI
6.56149 61 1 0.983607 0.0162585 0.952251 1.000000
14.42688 58 1 0.966648 0.0231936 0.922242 1.000000
28.42634 56 1 0.949386 0.0284876 0.895162 1.000000
28.84541 54 1 0.931805 0.0329415 0.869427 0.998658
28.84858 53 1 0.914224 0.0367130 0.845027 0.989087
33.72372 52 1 0.896643 0.0399957 0.821581 0.978562
35.49481 51 1 0.879061 0.0429020 0.798871 0.967301
35.71242 50 1 0.861480 0.0455040 0.776755 0.955446
37.73950 48 1 0.843533 0.0479650 0.754572 0.942981
41.95615 45 1 0.824787 0.0504291 0.731641 0.929793
43.23820 44 1 0.806042 0.0526518 0.709180 0.916135
44.22292 43 1 0.787297 0.0546624 0.687131 0.902065
48.84190 40 1 0.767615 0.0567288 0.664106 0.887257
49.24141 39 1 0.747932 0.0585893 0.641480 0.872050
50.42166 36 1 0.727156 0.0605334 0.617686 0.856027
50.60166 35 1 0.706380 0.0622672 0.594300 0.839599
51.00008 34 1 0.685605 0.0638078 0.571287 0.822798
52.00000 33 21 0.249311 0.0619235 0.153222 0.405659
gender=1
time n.risk n.event survival std.err lower 95% CI upper 95% CI
10.5119 39 1 0.974359 0.0253102 0.925994 1.000000
17.2280 37 1 0.948025 0.0357936 0.880404 1.000000
24.0235 36 1 0.921691 0.0434190 0.840402 1.000000
28.7516 35 1 0.895357 0.0495247 0.803367 0.997880
30.7129 33 1 0.868225 0.0549558 0.766927 0.982903
34.1409 32 1 0.841093 0.0595606 0.732095 0.966319
35.2230 31 1 0.813961 0.0635192 0.698519 0.948482
35.3501 30 1 0.786829 0.0669463 0.665973 0.929616
43.0588 26 1 0.756566 0.0708822 0.629649 0.909066
43.2310 25 1 0.726303 0.0742265 0.594466 0.887379
44.8028 24 1 0.696041 0.0770563 0.560275 0.864706
46.7601 23 1 0.665778 0.0794266 0.526965 0.841157
47.9673 21 1 0.634074 0.0817272 0.492524 0.816307
49.9674 20 1 0.602371 0.0835642 0.458966 0.790583
50.1777 18 1 0.568906 0.0853600 0.423959 0.763408
52.0000 15 8 0.265489 0.0834090 0.143425 0.491439
#KM-curves
ggsurvplot(km.model, data = dat, ggtheme = theme_bw(), conf.int = TRUE, risktable = "abs_pct", ncensor.plot = TRUE,
xlab = "Time in weeks", ylab = "Survival", xlim = c(0,52), break.x.by = 13)
CodePudding user response:
The object returned by ggsurvplot is a list which contains the main plot as an element called plot and the censored table plot as an element named ncensor.plot. Both of which are ggplot objects and can therefore be tweaked using default ggplot options. As an example in my code below I use scale_y_continuous to change the breaks of the y scale for the censored table plot:
library(survminer)
library(survival)
library(dplyr)
p <- ggsurvplot(km.model, data = dat, ggtheme = theme_bw(), conf.int = TRUE, risktable = "abs_pct", ncensor.plot = TRUE,
xlab = "Time in weeks", ylab = "Survival", xlim = c(0,52), break.x.by = 13)
p$ncensor.plot <- p$ncensor.plot scale_y_continuous(breaks = seq(12))
#> Scale for 'y' is already present. Adding another scale for 'y', which will
#> replace the existing scale.
p

EDIT The limits of the x axis could be set using the limits argument, where I also have set the breaks according to ones set by ggsurvplot by default, except for the 52 which I replaced by 51:
p$ncensor.plot <- p$ncensor.plot
scale_y_continuous(breaks = seq(12))
scale_x_continuous(breaks = c(0, 13, 26, 39, 51), limits = c(NA, 51))
p


