【问题标题】:forestplot use different shapes or colors森林图使用不同的形状或颜色
【发布时间】:2019-03-14 08:03:00
【问题描述】:

我想创建一个图,其中包含所有层的调整值(每个层的顶线)和匹配值(每个层中由 X 表示的线),例如男性、女性、年龄 55 岁等。对于匹配的值,我想要一个钻石/其他形状或不同的颜色来突出显示。但不知道怎么办?

我意识到我可以使用这个示例 http://gforge.se/2013/12/the-forestplot-of-dreams/ 来制作两个单独的数据集,一个用于调整值,一个用于匹配值,然后合并 - 但不想再次输入所有值。

有人可以帮助编辑我的代码的第三部分,以便为我的图表中的匹配值制作差异形状或差异颜色(匹配的值是 N 列中由 X 表示的线)。

 library(forestplot)
main_acevccb <- 
  structure(list(
    mean  = c(NA, NA, NA, -1.12, -0.64, -1.55,-1.60, NA, -1.35,-1.44, -1.3, -1.2, NA, -1.29,-1.23, -2.82,-2.15, -1.84,-2.72), 
    lower = c(NA, NA, NA, -1.41, -0.84, -1.85, -1.86, NA, -1.71,-1.9, -1.57,-1.52, NA, -1.53, -1.54, -4.04, -3.61, -2.85,-4.45),
    upper = c(NA, NA, NA, -0.83, -0.44, -1.26, -1.34, NA, -1.0, -0.98,-1.04, -0.87, NA, -1.04,-0.93, -1.59,-0.68, -0.82, -0.99)),
    .Names = c("Difference", "lower", "upper"), 
    row.names = c(NA, -19L), 
    class = "data.frame")

tabletext_acevccb<-cbind(
  c("", "Analysis", "", "Male", "", "Female","", "", "Aged <55yrs","",  "Aged >=55yrs", "", "", "White", "", "Black", "", "South Asian", ""),
  c("", "N", NA, "146,763", "X",  "123,425", "X", NA, "104,584","X", "165,604", "X", NA, "258,565", "X", "4,115", "X", "5,148", "X"), 
  c(NA, "Diff Sys BP 
    CCB vs ACE/ARB", NA, "-1.12","-0.64", "-1.55", "-1.60", NA, "-1.35", "-1.44", "-1.30", "-1.20", NA, "-1.29","-1.23",  "-2.82", "-2.15", "-1.84", "-2.72"), 
  c(NA, "95% CI", NA,"-1.41 : -0.83", "-0.84 : -0.44", "-1.85 : -1.26", "-1.86 : -1.34", NA, "-1.71 : -1.0", "-1.90 : -0.98", "-1.57 : -1.04", "-1.52 : -0.87", NA, "-1.53 : -1.04", "-1.54 : -0.93", "-4.04 : -1.59", "-3.61 : -0.68", "-2.85 : -0.82", "-4.45 : -0.99"))

forestplot(tabletext_acevccb, 
           main_acevccb,new_page = TRUE,    
           hrzl_lines=list("3" = gpar(lwd=1, col="#444444")), 
           is.summary=c(TRUE, TRUE, TRUE, rep(FALSE, 16)),
           txt_gp = fpTxtGp(label=gpar(cex=0.7)
           ),
           boxsize=0.25,
           xlog=F, 
           graphwidth = unit(7.5, "cm"),
           clip= c(-3.5, 0.5),
           xticks=c(-3.5, -3.0, -2.5, -2.0, -1.5, -1.0, -0.5 , 0, 0.5),
           col=fpColors(box="royalblue",line="darkblue"))

编辑 以下是根据以下建议提供图表的代码。谢谢你提出这个建议。但是,要按照上图保持“n”、“diff”和“95% CI” - 我认为我的问题可以简化为“如何修改上面的 col=fpColors 代码以将每个框涂上不同的颜色?”

 main_acevccb <- structure(list(
   analysis = c( "Male","Male", "Female", "Female", NA, "<55", "<55", ">55", ">55",NA, "White", "White", "Black","Black", "SA", "SA"),
   mean  = c( -1.12, -0.64, -1.55,-1.60, NA, -1.35,-1.44, -1.3, -1.2, NA, -1.29,-1.23, -2.82,-2.15, -1.84,-2.72), 
    lower = c( -1.41, -0.84, -1.85, -1.86, NA, -1.71,-1.9, -1.57,-1.52, NA, -1.53, -1.54, -4.04, -3.61, -2.85,-4.45),
    upper = c( -0.83, -0.44, -1.26, -1.34, NA, -1.0, -0.98,-1.04, -0.87, NA, -1.04,-0.93, -1.59,-0.68, -0.82, -0.99),
    type = c( "adjusted", "matched","adjusted", "matched", NA, "adjusted", "matched","adjusted", "matched", NA, "adjusted", "matched","adjusted", "matched", "adjusted", "matched")),
    .Names = c("Analysis","Difference", "lower", "upper", "type"), 
    row.names = (c(NA, -16L)), 
    class = "data.frame")


adjusted <- subset(main_acevccb, type!="matched"|is.na(type))
matched  <- subset(main_acevccb, type!="adjusted"|is.na(type))


forestplot(mean=cbind(adjusted[,"Difference"], matched[,"Difference"]),
           lower=cbind(adjusted[,"lower"], matched[,"lower"]), 
           upper=cbind(adjusted[,"upper"], matched[,"upper"]), 
           labeltext=matched$Analysis,
          legend=c("Adjusted", "Matched"),
          legend.pos=("bottomright"),           
          legend.gp = gpar(col="#AAAAAA"), 
          legend.r=unit(.1, "snpc"),
            fn.ci_norm = c(fpDrawNormalCI, fpDrawCircleCI),
           boxsize = .30, 
           line.margin = .5, 
           clip=c(-4.0, 1.0), 
           xticks=c(-4.0, -3.5, -3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0, 0.5, 1),
           col=fpColors(box=c("darkblue", "darkred")),
           xlab="Diff in Systolic BP CCB vs ACE-I/ARB",
           new_page=TRUE)

【问题讨论】:

    标签: r forestplot


    【解决方案1】:

    我意识到我可以使用这个示例 http://gforge.se/2013/12/the-forestplot-of-dreams/ 来创建两个单独的数据集,一个用于调整值,一个用于匹配值,然后组合 - 但宁愿不必再次输入所有值。

    选项1如果您想坚持使用forestplot,我认为您提到的链接(或here)中描述的解决方案是最佳的。 您不必输入所有数据 - 只需在数据框中添加一个额外的列,然后对其进行子集化。

    # You can add the column like this: 
    type = c(NA, NA, NA, "adjusted", "matched","adjusted", "matched", NA, "adjusted", "matched","adjusted", "matched", NA, "adjusted", "matched","adjusted", "matched", "adjusted", "matched")
    
    # So your dataframe will look like this: 
    main_acevccb <- structure(list(
        mean  = c(NA, NA, NA, -1.12, -0.64, -1.55,-1.60, NA, -1.35,-1.44, -1.3, -1.2, NA, -1.29,-1.23, -2.82,-2.15, -1.84,-2.72), 
        lower = c(NA, NA, NA, -1.41, -0.84, -1.85, -1.86, NA, -1.71,-1.9, -1.57,-1.52, NA, -1.53, -1.54, -4.04, -3.61, -2.85,-4.45),
        upper = c(NA, NA, NA, -0.83, -0.44, -1.26, -1.34, NA, -1.0, -0.98,-1.04, -0.87, NA, -1.04,-0.93, -1.59,-0.68, -0.82, -0.99),
        type = c(NA, NA, NA, "adjusted", "matched","adjusted", "matched", NA, "adjusted", "matched","adjusted", "matched", NA, "adjusted", "matched","adjusted", "matched", "adjusted", "matched")),
       .Names = c("Difference", "lower", "upper", "type"), 
       row.names = c(NA, -19L), 
       class = "data.frame")
    
    # ...and then you subset it:
    adjusted <- subset(main_acevccb, type!="matched"|is.na(type))
    matched  <- subset(main_acevccb, type!="adjusted"|is.na(type))
    

    然后,您将拥有两个单独的数据框,用于调整和匹配的值,并且可以按照链接中的说明进行操作。但是,使用该方法,您可以使用文本或不同的颜色。

    选项 2 如果你想同时拥有每行的文本标签和不同的颜色,你可以试试ggplot:

    # add 2 extra columns to your dataframe
    y=c(19, 18, 17, 16, 15, 14,13, 12, 11,10, 9, 8, 7, 6,5, 4,3, 2,1),
    Analysis=c("","","", "Male", "Male","Female","Female", "", "Aged <55yrs","Aged <55yrs",  "Aged >=55yrs", "Aged >=55yrs", "", "White", "White", "Black", "Black", "South Asian", "South Asian")),
    
    # so it will look like this:
    main_acevccb <- 
      structure(list(
        mean  = c(NA, NA, NA, -1.12, -0.64, -1.55,-1.60, NA, -1.35,-1.44, -1.3, -1.2, NA, -1.29,-1.23, -2.82,-2.15, -1.84,-2.72), 
        lower = c(NA, NA, NA, -1.41, -0.84, -1.85, -1.86, NA, -1.71,-1.9, -1.57,-1.52, NA, -1.53, -1.54, -4.04, -3.61, -2.85,-4.45),
        upper = c(NA, NA, NA, -0.83, -0.44, -1.26, -1.34, NA, -1.0, -0.98,-1.04, -0.87, NA, -1.04,-0.93, -1.59,-0.68, -0.82, -0.99),
        type = c(NA, NA, NA, "adjusted", "matched","adjusted", "matched", NA, "adjusted", "matched","adjusted", "matched", NA, "adjusted", "matched","adjusted", "matched", "adjusted", "matched"),
        y=c(19, 18, 17, 16, 15, 14,13, 12, 11,10, 9, 8, 7, 6,5, 4,3, 2,1),
        Analysis=c("","","", "Male", "Male","Female","Female", "", "Aged <55yrs","Aged <55yrs",  "Aged >=55yrs", "Aged >=55yrs", "", "White", "White", "Black", "Black", "South Asian", "South Asian")),
      .Names = c("Difference", "lower", "upper", "type", "y", "Analysis"), 
        row.names = c(NA, -19L), 
        class = "data.frame")
    
    # and make a graph with ggplot
    p <- ggplot(data=main_acevccb,
           aes(x = type,y = Difference, ymin = lower, ymax = upper ))+
      geom_pointrange(aes(col=type))+
      geom_hline(aes(fill=type),yintercept =0, linetype=2)+
      xlab('Type')+ ylab("Your axis title)")+
      geom_errorbar(aes(ymin=lower, ymax=upper,col=type),width=0.5,cex=1)+
      facet_wrap(~Analysis,strip.position="left",nrow=9,scales = "free_y") +
      theme(plot.title=element_text(size=16,face="bold"),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.text.x=element_text(face="bold"),
        axis.title=element_text(size=12,face="bold"),
        strip.text.y = element_text(hjust=0,vjust = 1,angle=180,face="bold"))+
      coord_flip()
    p <- p+ylim(-5, 5)
    
    # and finally add the text labels (modify it to get the labels you want) 
    p <- p+geom_text(label=c(rep("Difference (CI95%)")), y=1, hjust="left")  
    p
    

    【讨论】:

    • 非常感谢您的建议。我已经在上面发布了我的答案代码。但是,我对如何在该图中添加其他列感到有些迷茫,例如“n”、“Diff”和“95% CI”,正如我在上面的原始图中所概述的那样。 @MaxGordon 的代码(在上面的链接中提供)建议制作一个矩阵并将附加信息附加到行名。这对我来说很复杂,因为我想添加很多列。您对我如何轻松做到这一点有任何想法吗?
    • 我想我已经看到了添加文本列或多个图形符号的方法,但不能同时添加两者。从技术上讲,您已经在图表上显示了 Diff 和 95%,因此它们是您可以省略的冗余(?)。您可以在主组名称中包含样本量,例如“男性 (n=x)”。或者你可以把它放在一个列中。有问题的是为调整组和匹配组获取文本标签..
    • 我同意你关于冗余的观点,但我必须提供这些数据。 n 不能只添加到主组名称(例如,男性 n=x),因为调整和匹配的 n 是不同的。所以我真的需要添加额外的列。我上面提供的代码做到了这一点,但确实让我通过使用不同的形状/不同的颜色来突出显示匹配的组。这就是为什么我希望修改我的原始代码。
    • 我认为解决方案可能是使用我上面列出的原始代码,但使用类似于以下的代码改变框颜色:col=fpColors(box="royalblue", "green", "黄色”、“红色”、“紫色”、“粉色”、“橙色”、“宝蓝色”、“绿色”、“黄色”、“红色”、“紫色”、“粉色”、“橙色”))。这段代码实际上不起作用,但我怀疑这就是解决方案所在。
    • 您是否在任何地方看到过使用此软件包完成的操作?我已经看到使用 ggplot 实现相同结果的解决方案,但没有使用 forestplot...一种方法可能是为 n/Diff/CI95% 值制作单独的图表和表格(您甚至可以将它们加入两个面板图)。
    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2018-11-14
    • 2017-08-22
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    相关资源
    最近更新 更多