如何为 R 森林图中的多条垂直线分配唯一的颜色?

问题描述 投票:0回答:1

我正在使用森林图,想在图中放置一系列垂直线。我使用

grid
参数成功添加了所需数量的行。但是,我想为每条线分配不同的颜色,到目前为止我只能让它们共享相同的颜色。

library(dplyr)
library(forestplot)

df <- data.frame(
  model_name = rep(c('A','B','C','D'),3),
  group = c(rep("Qrt 2",4),rep("Qrt 3",4),rep("Qrt 4",4)),
  mean =  c(10, 9.5,  10.5,  11, 5, 4.75, 5.25, 5.05, 2,   1.9, 1.8, 1.7),
  lower = c(9,  8.5,  9.5,   10, 4, 4,    4.5,  4.25, 1.7, 1.6, 1.7, 1.65),
  upper = c(11, 10.5, 10.75, 12, 6, 5,    5.5,  5.8,  2.3, 2.2, 1.9, 1.75)
)

df |>
  group_by(group) |>
  forestplot(
    title = "Test Forest Plot",
    labeltext = model_name,
    boxsize = 0.2,
    vertices = TRUE,
    grid = structure(c(df[1,3], df[5,3], df[9,3]),
                     gp = gpar(lty = c(1,2,2), # line types other than the first one are ignored!
                               col = c("blue","green","red")))) |> # red and green are ignored!
  fp_set_style(box = c("blue", "green", "red"), # no problems with these colors, tho
               line = c("blue", "green", "red")) |>
  fp_add_header(model_name = c("Model")) |>
  fp_add_lines(h_2 = gpar(lwd = 1),
               h_3 = gpar(lwd = 1),
               h_4 = gpar(lwd = 1),
               h_5 = gpar(lwd = 1),
               h_6 = gpar(lwd = 1))

结果:

添加的3条垂直线都是蓝色的,但我希望它们是蓝色、绿色和红色,对应于各自

group
的颜色(即从右到左的蓝色、绿色、红色)。我不关心灰色零线,我现在忽略它。

我已经尝试了包含传递给

grid
的参数的structure()、c()和list()的各种排列,但到目前为止还没有运气。我还尝试过 fpColor:
col = fpColors(vrtcl_lines = c("blue","green","red"))
但是,同样缺乏结果。

单独控制线型也很好,我希望如果我能解决颜色问题,那么线型问题也能类似地解决。

如果可能的话,谁能告诉我如何做?感谢您的考虑。 (编辑:使颜色顺序在文本中保持一致)

r r-grid r-forestplot
1个回答
0
投票

使用

shapes_gp
对象定义
forestplot()
函数的
fpShapesGp
,该对象控制所有非文本元素的图形参数。

library(dplyr)
library(forestplot)

# Create your 'styles'
styles <- fpShapesGp(grid = list(
      gpar(lty = 1, col = "blue"),
      gpar(lty = 2, col = "green"),
      gpar(lty = 2, col = "red")))

# Provide your 'styles' to shapes_gp
df |>
  group_by(group) |>
  forestplot(
    title = "Test Forest Plot",
    labeltext = model_name,
    boxsize = 0.2,
    vertices = TRUE,
    grid = c(df[1,3], df[5,3], df[9,3]),
    shapes_gp = styles) |>
  fp_set_style(box = c("blue", "green", "red"),
               line = c("blue", "green", "red")) |>
  fp_add_header(model_name = c("Model")) |>
  fp_add_lines(h_2 = gpar(lwd = 1),
               h_3 = gpar(lwd = 1),
               h_4 = gpar(lwd = 1),
               h_5 = gpar(lwd = 1),
               h_6 = gpar(lwd = 1))


原始数据

df <- data.frame(
  model_name = rep(c('A','B','C','D'),3),
  group = c(rep("Qrt 2",4),rep("Qrt 3",4),rep("Qrt 4",4)),
  mean =  c(10, 9.5,  10.5,  11, 5, 4.75, 5.25, 5.05, 2,   1.9, 1.8, 1.7),
  lower = c(9,  8.5,  9.5,   10, 4, 4,    4.5,  4.25, 1.7, 1.6, 1.7, 1.65),
  upper = c(11, 10.5, 10.75, 12, 6, 5,    5.5,  5.8,  2.3, 2.2, 1.9, 1.75)
)
© www.soinside.com 2019 - 2024. All rights reserved.