【问题标题】:Using the R forestplot package, is there a way to assign variable colors to boxes?使用 R forestplot 包,有没有办法为盒子分配可变颜色?
【发布时间】:2016-09-08 13:48:29
【问题描述】:

作为示例,我将使用 R 森林图小插图 (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"))

但是,这样做会使这些框消失。有没有办法根据“测试”的值给盒子上色,或者森林图无法处理颜色向量?

【问题讨论】:

  • ?fpColors 告诉我们:“如果您在森林图中每行有多个值,您可以为向量设置颜色,其中第一个值表示第一行/框,第二个值表示第二个线/框等。” 所以我认为如果不修改功能,你就不能做你想做的事。

标签: r plot colors forestplot


【解决方案1】:

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

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

请注意,我不使用测试列,这应该足以让您找出余数。

【讨论】:

  • 很抱歉再次挖掘这个问题,但我坚持修改上面的代码以获得图中每个框的替代颜色。相当简单,但我无法弄清楚。想象一下你在图上有三个框,代码可能是这样的? ......col=fpColors(box="royalblue", "green", "yellow"), ...... 这对我不起作用。 :(
  • @user2363642 - fpColors 目前不允许这样做。您需要制作自己的绘图函数来处理这种情况。在上面的例子中,只需设置b_clrs=c("royalblue","green","yellow") 和你的罚款。这有点 hacky,但它会完成这项工作。
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 2020-06-27
  • 2020-12-10
相关资源
最近更新 更多