Search code examples
rsurvival-analysisr-forestplot

Can we color the different rows/covariates/studies in different colors in R forest plots?


Using the forestplot package in the programming language R, I would like to make a forest plot that has each row in a different color. By each row, I mean the boxes and the respective confidence intervals.

Taking an example from the vignette [https://cran.r-project.org/web/packages/forestplot/vignettes/forestplot.html], enter image description here

library(forestplot)
# Cochrane data from the 'rmeta'-package
cochrane_from_rmeta <- 
  structure(list(
    mean  = c(NA, NA, 0.578, 0.165, 0.246, 0.700, 0.348, 0.139, 1.017, NA, 0.531), 
    lower = c(NA, NA, 0.372, 0.018, 0.072, 0.333, 0.083, 0.016, 0.365, NA, 0.386),
    upper = c(NA, NA, 0.898, 1.517, 0.833, 1.474, 1.455, 1.209, 2.831, NA, 0.731)),
    .Names = c("mean", "lower", "upper"), 
    row.names = c(NA, -11L), 
    class = "data.frame")

tabletext <- cbind(c("", "Study", "Auckland", "Block", "Doran", "Gamsu", "Morrison", "Papageorgiou", "Tauesch", NA, "Summary"),
  c("Deaths", "(steroid)", "36", "1", "4", "14", "3", "1", "8", NA, NA),
  c("Deaths", "(placebo)", "60", "5", "11", "20", "7", "7", "10", NA, NA),
  c("", "OR", "0.58", "0.16", "0.25", "0.70", "0.35", "0.14", "1.02", NA, "0.53"))

forestplot(tabletext, cochrane_from_rmeta, new_page = TRUE,
           is.summary = c(TRUE, TRUE, rep(FALSE, 8), TRUE),
           clip = c(0.1,2.5), xlog = TRUE, 
           col = fpColors(box="royalblue",line="darkblue", summary="royalblue"))

I want each study to have its own color (Auckland can be colored blue, Block can be colored red, Doran can be colored green, and so on). I think that this might be accomplished by changing the argument to the fpColors() function.

Is there any way to do this?


Solution

  • Take a look at fpShapesGp. With this, it's possible to color the rows in different colors.

    An simple example for your code:

    styles <- fpShapesGp(
      lines = list(
        gpar(col = "black"),
        gpar(col = "blue"),
        gpar(col = "black"),
        gpar(col = "blue"),
        gpar(col = "black"),
        gpar(col = "blue"),
        gpar(col = "black"),
        gpar(col = "blue"),
        gpar(col = "black"),
        gpar(col = "blue"),
        gpar(col = "black")
      ),
      box = list(
        gpar(fill = "black"),
        gpar(fill = "blue"),
        gpar(fill = "black"),
        gpar(fill = "blue"),
        gpar(fill = "black"),
        gpar(fill = "blue"),
        gpar(fill = "black"),
        gpar(fill = "blue"),
        gpar(fill = "black"),
        gpar(fill = "blue"),
        gpar(fill = "black")
      ) 
    )
    
    forestplot(tabletext, cochrane_from_rmeta, new_page = TRUE,
               is.summary = c(TRUE, TRUE, rep(FALSE, 8), TRUE),
               clip = c(0.1,2.5), xlog = TRUE, 
               shapes_gp = styles)
    

    As a result you get this: enter image description here