Build Status CRAN_Status_Badge Downloads Total Downloads Project Status: Active - The project has reached a stable, usable state and is being actively developed. Pending Pull-Requests Github Issues


survminer: Survival Analysis and Visualization

The survminer R package provides functions for facilitating survival analysis and visualization.

The main functions, in the package, are organized in different categories as follow.

Survival Curves


Diagnostics of Cox Model


Summary of Cox Model


Competing Risks


Find out more at http://www.sthda.com/english/rpkgs/survminer/, and check out the documentation and usage examples of each of the functions in survminer package.

Installation and loading

Install from CRAN as follow:

install.packages("survminer")

Or, install the latest version from GitHub:

if(!require(devtools)) install.packages("devtools")
devtools::install_github("kassambara/survminer", build_vignettes = FALSE)

Load survminer:

library("survminer")

ggsurvplot: Drawing survival curves

Fitting survival curves

require("survival")
fit <- survfit(Surv(time, status) ~ sex, data = lung)

Basic plots

ggsurvplot(fit, data = lung)

Customized survival curves

ggsurvplot(fit, data = lung, size = 1,  # change line size
           palette = c("#E7B800", "#2E9FDF"), # custom color palettes
           conf.int = TRUE, # Add confidence interval
           pval = TRUE, # Add p-value
           risk.table = TRUE, # Add risk table
           risk.table.col = "strata", # Risk table color by groups
           legend.labs = c("Male", "Female"), # Change legend labels
           risk.table.height = 0.25, # Useful to change when you have multiple groups
           ggtheme = theme_bw() # Change ggplot2 theme
           )

Note that, additional arguments are available to customize the main title, axis labels, the font style, axis limits, legends and the number at risk table.

More customized survival curves

Focus on xlim and break.time.by parameters which do not change the calculations of estimates of survival surves. Also note risk.table.y.text.col = TRUE and risk.table.y.text = FALSE that provide bars instead of names in text annotations of the legend of risk table.

ggsurvplot(
   fit,                     # survfit object with calculated statistics.
   data = lung,             # data used to fit survival curves.
   risk.table = TRUE,       # show risk table.
   pval = TRUE,             # show p-value of log-rank test.
   conf.int = TRUE,         # show confidence intervals for 
                            # point estimates of survival curves.
   xlim = c(0,500),         # present narrower X axis, but not affect
                            # survival estimates.
   xlab = "Time in days",   # customize X axis label.
   break.time.by = 100,     # break X axis in time intervals by 500.
   ggtheme = theme_light(), # customize plot and risk table with a theme.
 risk.table.y.text.col = T, # colour risk table text annotations.
  risk.table.y.text = FALSE # show bars instead of names in text annotations
                            # in legend of risk table
)

Uber customized survival curves

ggsurv <- ggsurvplot(
           fit,                     # survfit object with calculated statistics.
           data = lung,             # data used to fit survival curves.
           risk.table = TRUE,       # show risk table.
           pval = TRUE,             # show p-value of log-rank test.
           conf.int = TRUE,         # show confidence intervals for 
                                    # point estimates of survival curves.
           xlim = c(0,500),         # present narrower X axis, but not affect
                                    # survival estimates.
           xlab = "Time in days",   # customize X axis label.
           break.time.by = 100,     # break X axis in time intervals by 500.
           ggtheme = theme_light(), # customize plot and risk table with a theme.
          risk.table.y.text.col = T,# colour risk table text annotations.
          risk.table.height = 0.25, # the height of the risk table
          risk.table.y.text = FALSE,# show bars instead of names in text annotations
                                    # in legend of risk table.
          ncensor.plot = TRUE,      # plot the number of censored subjects at time t
          ncensor.plot.height = 0.25,
          conf.int.style = "step",  # customize style of confidence intervals
          surv.median.line = "hv",  # add the median survival pointer.
          legend.labs = 
            c("Male", "Female")    # change legend labels.
        )

# Apply custom color palettes and print
ggpar(ggsurv, palette = c("#E7B800", "#2E9FDF"))

Uber platinum customized survival curves

# Changing Labels
# %%%%%%%%%%%%%%%%%%%%%%%%%%
# Labels for Survival Curves (plot)
ggsurv$plot <- ggsurv$plot + labs(
  title = "Survival curves",                     
  subtitle = "Based on Kaplan-Meier estimates",  
  caption = "created with survminer"             
  )

# Labels for Risk Table 
ggsurv$table <- ggsurv$table + labs(
  title = "Note the risk set sizes",          
  subtitle = "and remember about censoring.", 
  caption = "source code: website.com"        
  )

# Labels for ncensor plot 
ggsurv$ncensor.plot <- ggsurv$ncensor.plot + labs( 
  title = "Number of censorings", 
  subtitle = "over the time.",
  caption = "source code: website.com"
  )

# Changing the font size, style and color
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# Applying the same font style to all the components of ggsurv:
# survival curves, risk table and censor part

ggsurv <- ggpar(ggsurv,
          font.title = c(16, "bold", "darkblue"),         
          font.subtitle = c(15, "bold.italic", "purple"), 
          font.caption = c(14, "plain", "orange"),        
          font.x = c(14, "bold.italic", "red"),          
          font.y = c(14, "bold.italic", "darkred"),      
          font.tickslab = c(12, "plain", "darkgreen"),
          legend = "top"
          )

# Apply custom color palettes and print
ggpar(ggsurv, palette = c("#E7B800", "#2E9FDF"))

Uber platinum premium customized survival curves

# Using specific fonts for risk table and ncensor plots
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# Font for Risk Table
ggsurv$table <- ggpar(ggsurv$table,
                      font.title = c(13, "bold.italic", "green"),
                      font.subtitle = c(15, "bold", "pink"),
                      font.caption = c(11, "plain", "darkgreen"),
                      font.x = c(8, "bold.italic", "orange"),
                      font.y = c(11, "bold.italic", "darkgreen"),
                      font.tickslab = c(9, "bold", "red")
                      )


# Font for ncensor plot
ggsurv$ncensor.plot <- ggpar(ggsurv$ncensor.plot,
                            font.title = c(13, "bold.italic", "green"),
                            font.subtitle = c(15, "bold", "pink"),
                            font.caption = c(11, "plain", "darkgreen"),
                            font.x = c(8, "bold.italic", "orange"),
                            font.y = c(11, "bold.italic", "darkgreen"),
                            font.tickslab = c(9, "bold", "red")
                            )

print(ggsurv)

Blog posts