You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用stat_pvalue_manual为geom_bar添加p值时括号显示异常求助

问题:stat_pvalue_manual添加p值时括号无法显示

我使用stat_pvalue_manual函数为geom_bar柱状图添加组间p值,p值能正常显示,但组间对比的括号无法出现。相关数据、统计表及原代码如下:

数据集

Data_test=structure(list(PE = c(87, 32, 15, 87, 43, 65, 76, 25), 
                         BU = c("A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4"), 
                         PH = c("NAF", "NAF","NAF", "NAF", "AF", "AF", "AF", "AF")), 
                   class = c("grouped_df", "tbl_df", "tbl", "data.frame"), 
                   row.names = c(NA, -8L), 
                   groups = structure(list(BU = c("A1","A1", "A2", "A2", "A3", "A3","A4", "A4"), 
                   PH = c("AF","NAF", "AF", "NAF", "AF", "NAF","AF", "NAF"), .rows = structure(list(5L, 1L, 6L, 2L, 7L, 3L, 8L, 4L), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
                                                                                                                                                                                                                                                                                                                               ), row.names = c(NA, -8L), .drop = TRUE))

统计表

Stat_test= structure(list(group1 = c("NAF", "NAF", "NAF", 
                          "NAF"), group2 = c("AF", "AF", "AF", 
                                                      "AF"), PE = c(65, 87, 87, 
                                                                            43), 
                                                                                                       
                                                                                                                                                         p = c(0.7654, 
                                                                                                                                                                                                                       0.456, 0.789, 0.003),  BU = c("A1", "A2", "A3", "A4")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  -4L))

原绘图代码

library(ggpubr)
library(ggplot2)

ggplot(Data_test, aes(x=BU, y=PE)) +
  geom_bar(aes(fill=PH), stat="identity", position=position_dodge(), color="black") +
  stat_pvalue_manual(Stat_test, y.position = 100, size=4,
                     label = "p", inherit.aes = FALSE, remove.bracket = FALSE,  x="BU", 
                     tip.length = 0.02, bracket.size = 4, ) +
  ylim(c(0,100))

数据预览

> Data_test
# A tibble: 8 × 3
# Groups:   BU, PH [8]
     PE BU    PH   
  <dbl> <chr> <chr>
1    87 A1    NAF  
2    32 A2    NAF  
3    15 A3    NAF  
4    87 A4    NAF  
5    43 A1    AF   
6    65 A2    AF   
7    76 A3    AF   
8    25 A4    AF   

> Stat_test
  group1 group2 PE      p BU ypos
1    NAF     AF 65 0.7654 A1  100
2    NAF     AF 87 0.4560 A2  100
3    NAF     AF 87 0.7890 A3  100
4    NAF     AF 43 0.0030 A4  100

问题原因与解决方案

核心问题

  1. 分组映射未继承:原代码中stat_pvalue_manual设置了inherit.aes = FALSE,且未指定fill=PH,导致函数无法识别同一BU下的两个对比组(NAF/AF);
  2. 位置未对齐:geom_bar使用了position_dodge,但stat_pvalue_manual未同步该参数,括号无法定位到两个柱子的位置;
  3. y轴范围截断:y.position=100刚好等于ylim的上限,括号被截断无法显示;
  4. 括号线宽过粗:bracket.size=4线宽过大,可能导致括号显示异常。

修正后的代码

library(ggpubr)
library(ggplot2)

# 取消数据集的分组状态,避免绘图干扰
Data_test <- ungroup(Data_test)

ggplot(Data_test, aes(x=BU, y=PE, fill=PH)) +
  geom_bar(stat="identity", position=position_dodge(width=0.8), color="black") +
  stat_pvalue_manual(Stat_test, 
                     y.position = 105,  # 调整y位置,避免被y轴边界截断
                     size=4,
                     label = "p = {p}",  # 规范p值显示格式
                     inherit.aes = TRUE,  # 继承主图的分组映射
                     remove.bracket = FALSE,  
                     position = position_dodge(width=0.8),  # 和柱状图的dodge宽度同步
                     tip.length = 0.02, 
                     bracket.size = 1) +  # 减小括号线宽,避免显示异常
  ylim(c(0, 110))  # 扩大y轴范围,容纳括号和p值

关键改动说明

  • 取消数据集分组:原grouped_df可能干扰绘图的分组识别;
  • 主图aes加入fill=PH并让stat_pvalue_manual继承,确保函数识别组间对比;
  • 同步position_dodge(width=0.8):保证括号位置与柱子对齐;
  • 调整y轴位置和范围:避免括号被边界截断;
  • 规范p值标签格式,减小括号线宽:提升显示效果。

内容的提问来源于stack exchange,提问作者Av65

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:45:13