我正在使用森林图,想在图中放置一系列垂直线。我使用
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"))
但是,同样缺乏结果。
单独控制线型也很好,我希望如果我能解决颜色问题,那么线型问题也能类似地解决。
如果可能的话,谁能告诉我如何做?感谢您的考虑。 (编辑:使颜色顺序在文本中保持一致)
使用
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)
)