如何在forestplot森林图中基于截断值1添加分组标签
在forestplot森林图的截断值1处添加Yes/No分组标签
需求
用R语言forestplot包绘制森林图时,需要在x=1的截断线位置添加两个标签:上方标注Yes(对应OR值大于1的组别),下方标注No(对应OR值小于1的组别),预期效果如下:

数据与现有代码
数据
library(forestplot) # 构造可直接运行的数据框 dataout <- data.frame( variables = c("Mother", "sibling", "X1", "X2", "X3", "X4", "X5", "X6", "X7"), mean = c(0.9411774, 0.8714648, 1.1250240, 1.1792050, 1.0473570, 1.5371143, 1.3714805, 0.8939320, 0.7126186), lower = c(0.8968472, 0.7983499, 1.0106318, 1.0062237, 0.8227960, 1.2682586, 1.1762861, 0.7480613, 0.5683382), upper = c(0.9876988, 0.9512757, 1.2523641, 1.3819239, 1.3332062, 1.8629644, 1.5990656, 1.0682473, 0.8935264) )
现有绘图代码
dataout |> forestplot(labeltext = variables, zero = 1, xlog = TRUE, vertices = TRUE, boxsize = 0.2) |> fp_set_style(box = "royalblue", line = "darkblue", summary = "royalblue") |> fp_set_zebra_style("#EFEFEF")
实现方法
借助fp_annotate()函数在指定坐标位置添加标签,调整y参数控制标签上下位置,代码如下:
library(forestplot) library(grid) dataout |> forestplot(labeltext = variables, zero = 1, xlog = TRUE, vertices = TRUE, boxsize = 0.2) |> fp_set_style(box = "royalblue", line = "darkblue", summary = "royalblue") |> fp_set_zebra_style("#EFEFEF") |> # 在截断线上方添加Yes标签 fp_annotate(x = 1, y = 1.2, label = "Yes", just = "right", gp = gpar(fontsize = 10)) |> # 在截断线下方添加No标签(根据数据行数动态定位) fp_annotate(x = 1, y = nrow(dataout) + 0.8, label = "No", just = "right", gp = gpar(fontsize = 10))
细节说明
x=1:指定标签在截断值1的位置;y参数:y=1.2对应图顶端的上方区域,y=nrow(dataout)+0.8对应图底端的下方区域(动态适配数据行数,避免硬编码);just="right":让标签右对齐,紧贴x=1的竖线;gpar(fontsize):可根据需求调整标签字体大小,匹配图的整体风格。
如果需要更精准的位置控制,可以结合grid包的坐标转换函数微调:
# 示例:基于绘图区域比例定位 fp_annotate(x = unit(convertX(unit(1, "native"), "npc", axisFrom = "x"), "native"), y = unit(0.95, "npc"), label = "Yes", just = "right")
内容的提问来源于stack exchange,提问作者cliu
相关产品推荐
相关产品推荐

