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
相关产品推荐
相关产品推荐

