代码之家  ›  专栏  ›  技术社区  ›  mshum

使用R forestplot包,有没有办法为框指定可变颜色?

  •  1
  • mshum  · 技术社区  · 9 年前

    作为示例,我将使用R forestplot vignette中的代码( https://cran.r-project.org/web/packages/forestplot/vignettes/forestplot.html ):

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

    我不想让所有框都是相同的颜色,而是希望根据另一个变量的值给框上色。我修改了示例代码,在cochrane_from_rmeta中添加了另一列(“test”),并希望根据“test“的值给框上色。我想代码应该是这样的:

    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)),
        test = c(NA,NA,1,3,1,7,4,9,6,NA,2)),
        .Names = c("mean", "lower", "upper", "test"), 
        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=cochrane_from_rmeta$test,line="darkblue", summary="royalblue"))
    

    然而,这样做会使框消失。有没有一种方法可以根据“test”的值给方框上色,或者forestplot无法处理颜色矢量?

    1 回复  |  直到 9 年前
        1
  •  3
  •   Max Gordon    9 年前

    可以使用您自己的自定义线条绘制功能:

    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"))
    
    fn <- local({
      i = 0
      no_lines <- sum(!is.na(cochrane_from_rmeta$mean))
      b_clrs = colorRampPalette(colors=c("pink", "blue"))(no_lines)
      l_clrs = colorRampPalette(colors=c("blue", "pink"))(no_lines)
    
      function(..., clr.line, clr.marker){
        i <<- i + 1
        fpDrawNormalCI(..., clr.line = l_clrs[i], clr.marker = b_clrs[i])
      }
    })
    forestplot(tabletext, fn.ci_norm = fn,
               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(summary="royalblue"))
    

    enter image description here

    请注意,我没有使用测试列,这应该足以让您计算出其余部分。