R ggplot2绘制森林图时如何限制竖线仅在对应分组内显示
ggplot2分组森林图实现分区域显示参考竖线
问题场景
绘制多分组森林图时初始代码如下:
d = data.frame(Estimate = c(1.8,1.9,2.1,2.4,2.7,2.5), Group = rep(c('Group A', 'Group B'), each = 3), Method = rep(c('Method 1', 'Method 2', 'Method 3'), 2)) d$Lower = d$Estimate - 0.3 d$Upper = d$Estimate + 0.3 ggplot(data = d, aes(y = Group, x = Estimate, xmin = Lower, xmax = Upper, color = Method)) + geom_point(size = 2, position=position_dodge(width = 0.5)) + geom_linerange(position=position_dodge(width = 0.5)) + geom_vline(xintercept = c(2, 2.5), linetype = "dashed")
代码生成的图中,x截距为2、2.5的两条虚线竖线分别对应两个分组的真实均值,默认会贯穿整个y轴绘图区。需求为将两条竖线的显示范围限制在所属分组区域内:x=2的竖线仅在下方Group A区域显示,x=2.5的竖线仅在上方Group B区域显示。
此前尝试使用geom_segment()实现,但该函数需要传入数值型y轴坐标,而当前y轴映射的是因子类型变量,无法直接适配。
实现方法
ggplot2会自动将y轴的因子水平按排列顺序映射为从1开始的整数值:第一个因子水平对应y=1,第二个对应y=2,以此类推。每个因子水平在y轴上的默认显示范围以整数坐标为中心,上下各延伸0.5单位,直接利用这个隐式映射规则即可搭配geom_segment()绘制限定范围的竖线,无需修改原有y轴的因子映射。
完整可运行代码如下:
library(ggplot2) d = data.frame(Estimate = c(1.8,1.9,2.1,2.4,2.7,2.5), Group = rep(c('Group A', 'Group B'), each = 3), Method = rep(c('Method 1', 'Method 2', 'Method 3'), 2)) d$Lower = d$Estimate - 0.3 d$Upper = d$Estimate + 0.3 # 构建参考线专属数据框,定义每条线的x轴位置、y轴起止范围 ref_line <- data.frame( x = c(2, 2.5), ymin = c(0.5, 1.5), ymax = c(1.5, 2.5) ) ggplot(data = d, aes(y = Group, x = Estimate, xmin = Lower, xmax = Upper, color = Method)) + geom_point(size = 2, position=position_dodge(width = 0.5)) + geom_linerange(position=position_dodge(width = 0.5)) + geom_segment( data = ref_line, aes(x = x, xend = x, y = ymin, yend = ymax), linetype = "dashed", color = "black", inherit.aes = FALSE )
注意事项
- 必须设置
inherit.aes = FALSE,该参数会让geom_segment()不继承全局ggplot的映射规则,避免因参考线数据框缺少Method等列触发报错 - 参考线y轴范围规则固定:y轴因子中第n个水平的显示区间为
n-0.5到n+0.5,如果后续调整了因子水平的排列顺序,同步修改参考线数据框对应的ymin、ymax数值即可 - 如果需要给参考线添加分组视觉映射(比如按分组区分参考线颜色),直接在参考线数据框中添加对应列,在
aes()内配置映射关系即可
内容的提问来源于stack exchange,提问作者Zhili Qiao
相关产品推荐
相关产品推荐

