我正在使用forestplot,并希望在图中放置一系列垂直线. 我成功地添加了我想要的行,使用grid参数.但是,我想为每行分配不同的 colored颜色 ,到目前为止,我只能让它们共享相同的 colored颜色 .

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

结果:

Forest plot but the 3 vertical lines are all blue

添加的3条垂直线都是蓝色的,但我希望它们是蓝色、绿色和红色,对应于相应的group的 colored颜色 (即,蓝色、绿色、红色,从右到左).我不在乎灰零线,我暂时忽略它.

我try 了Structure()、c()和list()的各种组合,它们包含传递给grid的参数,但到目前为止还没有成功.我还try 过fpColor: col = fpColors(vrtcl_lines = c("blue","green","red")) 但是,同样缺乏结果.

单独控制线条类型也是很好的,我希望如果我能解决 colored颜色 问题,那么线条类型问题也可以类似地解决.

如果可能的话,有人能告诉我怎么做吗?谢谢你的考虑. (edit: made color order consistent in the text)

推荐答案

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

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

shapes_gp-styles


Raw data

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

R相关问答推荐

按块将载体转换为矩阵-reshape

在特定列上滞后n行,同时扩展框架的长度

将年度数据插入月度数据

如何在xyplot中 for each 面板打印R^2

如何从当前行上方找到符合特定条件的最接近值?

如何通过Docker部署我的shiny 应用程序(多个文件)

使用ggsankey调整Sankey图中单个 node 上的标签

在ggplot中为不同几何体使用不同的 colored颜色 比例

将小数分隔符放在R中的前两位数字之后

用R ggplot2求上、下三角形中两个变量的矩阵热图

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

将箭头绘制在图形外部,而不是图形内部

如何显示准确的p值而不是<;0.001*?

如何在AER::ivreg中指定仪器?

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

将边列表转换为路径长度列表

通过比较来自多个数据框的值和R中的条件来添加新列

使用nls()函数的非线性模型的半正态图

如何使用ggsurvfit包更改风险表中的标签名称?

如何根据顺序/序列从数据框中排除值