使用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
问题原因与解决方案
核心问题
- 分组映射未继承:原代码中
stat_pvalue_manual设置了inherit.aes = FALSE,且未指定fill=PH,导致函数无法识别同一BU下的两个对比组(NAF/AF); - 位置未对齐:
geom_bar使用了position_dodge,但stat_pvalue_manual未同步该参数,括号无法定位到两个柱子的位置; - y轴范围截断:
y.position=100刚好等于ylim的上限,括号被截断无法显示; - 括号线宽过粗:
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
相关产品推荐
相关产品推荐

