在geom_bracket的glue函数中用$引用数据框的相关疑问
问题解答
1. 当前代码的问题
能正常运行出结果,但不是ggplot结合glue的最佳实践,存在两个潜在问题:
- 直接通过
dfxx$引用全局环境的数据框列,违背了ggplot图层数据上下文的设计原则,代码耦合性过高——如果后续dfxx被重命名、删除或修改,绘图代码会直接出错。 - 手动指定
y.position = c(53,60,53)的写法不够灵活,要是后续分组数量或均值高度变化,这个数值就得手动调整,维护成本高。
2. 去掉$符号报错的原因
glue默认会在**调用它的当前环境(这里是全局环境)**里查找变量,而p.adj、p.adj.signif是dfxx数据框的列,不是全局变量,所以glue找不到这些对象,直接报错。
3. 更规范的写法
推荐两种符合ggplot语法的写法,都无需依赖全局环境的dfxx$引用:
方法一:用glue_data绑定数据上下文
glue_data可以直接指定数据框作为变量查找的上下文,写法更直观:
dfxplotx <- ggplot(lobxx,aes(x= reorder(ageG,-height),y=height,fill=ageG))+ stat_summary(geom="col",fun = mean)+ ggpubr::geom_bracket( mapping=aes(xmin = group1, xmax = group2), data = dfxx, label = glue_data(dfxx, "P:{p.adj}{p.adj.signif}"), y.position = c(53,60,53), bracket.nudge.y = 5, inherit.aes = F )
方法二:用.data代词引用图层数据列
在ggplot图层中,.data是特殊代词,用来引用当前图层data参数指定的数据框列,glue就能正确找到变量:
dfxplotx <- ggplot(lobxx,aes(x= reorder(ageG,-height),y=height,fill=ageG))+ stat_summary(geom="col",fun = mean)+ ggpubr::geom_bracket( mapping=aes(xmin = group1, xmax = group2), data = dfxx, label = glue("P:{.data$p.adj}{.data$p.adj.signif}"), y.position = c(53,60,53), bracket.nudge.y = 5, inherit.aes = F )
额外优化:自动使用计算好的y位置
rstatix::add_xy_position已经帮你计算好了y.position,无需手动指定,直接引用即可:
dfxplotx <- ggplot(lobxx,aes(x= reorder(ageG,-height),y=height,fill=ageG))+ stat_summary(geom="col",fun = mean)+ ggpubr::geom_bracket( mapping=aes(xmin = group1, xmax = group2, label = glue("P:{.data$p.adj}{.data$p.adj.signif}")), data = dfxx, bracket.nudge.y = 5, inherit.aes = F )
内容的提问来源于stack exchange,提问作者hanysalem
相关产品推荐
相关产品推荐

