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

R语言如何为水平条形图添加显著性标记括号

完全可以实现,不需要更换绘图包,只要调整坐标系和显著性标记的参数映射即可。

修改要点

  • 原有垂直条形图的核心逻辑不需要改动,在代码末尾加coord_flip()就能切换为水平方向,唯一要调整的是geom_signif()里的位置参数:翻转坐标系后原x轴和y轴的映射互换,原来控制垂直方向高度的y_position要替换为x_position,原来控制水平方向左右边界的xmin/xmax要替换为ymin/ymax,数值调整逻辑和你之前配置垂直图的规则完全一致。
  • 原绘图代码没有筛选value==1的选中记录,会把未选中的计数也生成条形,和卡方检验对比组间选中率的目标不匹配,修改后的代码补充了对应筛选步骤。

可直接运行的修改后代码

library(tidyverse)
library(broom)
library(ggsignif)

# 构造示例数据集
group1<-sample(c("A", "B"), 100, replace=T)
var1<-sample(c(0,1),100, replace=T, prob=c(0.3, 0.7))
var2<-sample(c(0,1),100, replace=T, prob=c(0.4, 0.6))
var3<-sample(c(0,1),100, replace=T, prob=c(0.8, 0.2))
df<-data.frame(group1, var1, var2, var3)

# 卡方检验+Bonferroni多重比较校正
df %>% 
  pivot_longer(-group1) %>% 
  group_by(group1, name, value) %>% 
  nest(-name) %>%
  mutate(model=map(data, ~chisq.test(.$group1, .$value)), 
         tidied=map(model, tidy)) %>% 
  unnest(tidied)->x2_test
x2_test$p.value<-p.adjust(x2_test$p.value, method="bonferroni", n=3)

# 绘制带显著性标记的水平条形图
df %>% 
  pivot_longer(-group1) %>% 
  filter(value == 1) %>% # 仅统计选中的样本量
  group_by(name, group1, value) %>% 
  summarize(n=n()) %>% 
  ggplot(aes(x=name, y=n, fill=group1))+
  geom_col(position="dodge")+
  geom_signif(
    x_position = c(55,55,55), # 显著性标记的水平位置,略高于最长条形即可
    ymin = c(0.8, 1.8, 2.8),  # 每组对比条形的下边界
    ymax = c(1.2, 2.2, 3.2),  # 每组对比条形的上边界
    annotation = x2_test$p.value, 
    map_signif_level = T
  )+
  coord_flip() # 翻转坐标系生成水平条形图

注意事项

  • 位置参数的数值可以根据实际数据集的条形长度微调,保证显著性标记不会和条形、其他标记重叠即可
  • 如果不想用coord_flip(),也可以直接把aes里x和y的映射互换(x=n, y=name),显著性参数的配置逻辑不变,最终展示效果完全一致
  • 星号标记的转换规则和原垂直图完全一致:*代表p<0.05,**代表p<0.01,***代表p<0.001。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:45:51