使用geom_signif实现ggplot2分组箱线图组内不同x水平的差异检验
分组箱线图按group分层标注组内差异的实现方案
核心逻辑:当同时设置x和fill映射时,ggplot会通过位置偏移(默认dodge宽度0.75)展示同x下的不同分组箱线,需要让geom_signif的位置偏移和箱线图对齐,或手动指定显著性条的坐标即可实现分层标注。
方法1:分层调用geom_signif(适配性更强)
完整可运行代码如下:
library(ggplot2) library(ggsignif) library(dplyr) # 构造测试数据 d <- data.frame( x = c('a', 'a', 'a', 'a', 'b', 'b', 'b','b'), y = c(13, 12, 12, 5, 14, 6, 10, 11), group = c('g1','g2','g1','g2','g1','g2','g1','g2') ) ggplot(d, aes(x = x, y = y, fill = group)) + # 统一指定dodge宽度,保证箱线和显著性条偏移量一致 geom_boxplot(position = position_dodge(width = 0.8)) + # 标注g1组内a和b的差异 geom_signif( data = ~filter(.x, group == "g1"), aes(group = group), comparisons = list(c("a", "b")), y_position = 14.5, # 显著性条的y轴高度,可自行调整 tip_length = 0.01, # 显著性条两端短竖线的长度 position = position_dodge(width = 0.8), map_signif_level = TRUE # 自动将p值转为*标记,不需要可以去掉 ) + # 标注g2组内a和b的差异 geom_signif( data = ~filter(.x, group == "g2"), aes(group = group), comparisons = list(c("a", "b")), y_position = 13, tip_length = 0.01, position = position_dodge(width = 0.8), map_signif_level = TRUE )
方法2:手动指定显著性条坐标(更灵活)
如果需要自定义标注内容、不需要自动计算p值,可以直接指定坐标批量生成标注:
ggplot(d, aes(x = x, y = y, fill = group)) + geom_boxplot(position = position_dodge(width = 0.8)) + geom_signif( # 自定义标注内容,也可以换成自己计算的显著性标记 annotations = c( round(wilcox.test(y~x, filter(d, group == "g1"))$p.value, 3), round(wilcox.test(y~x, filter(d, group == "g2"))$p.value, 3) ), y_position = c(14.5, 13), # 两个显著性条的高度 xmin = c(0.7, 1.3), # 每个显著性条的左端点x坐标 xmax = c(1.7, 2.3), # 每个显著性条的右端点x坐标 tip_length = 0.01 )
参数调整说明
- 如果你修改了箱线图的dodge宽度,需要同步调整
geom_signif的dodge宽度,或者手动调整xmin/xmax的数值,保证显著性条和对应箱线对齐 y_position可以根据你的数据范围自由调整,避免标注和箱线、其他标注重叠- 检验方法默认是wilcox秩和检验,如果需要用t检验,可以给
geom_signif加参数test = "t.test"
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

