如何在ggplot中添加Dunn检验的显著性结果标注?
在ggplot柱状图中标注Dunn检验显著性结果
下面提供两种实现方案,满足你「小写字母标注同一type不同day的差异,大写字母标注同一day不同type的差异」的需求,也可仅标注单一维度差异。
方案一:自动关联Dunn检验结果标注
该方法直接从Dunn检验结果生成显著性分组字母,自动匹配到对应柱状图上方。
步骤1:加载所需包
除你已安装的包外,额外需要rcompanion生成显著性字母、dplyr整理数据:
library(plotrix) library(ggplot2) library(dunn.test) library(rcompanion) library(dplyr)
步骤2:修正并整理绘图数据
你原代码中CAT为笔误,替换为数据集实际变量TAC:
aa <- aggregate(TAC ~ day + type, data=table5, FUN=mean) ee <- aggregate(TAC ~ day + type, data=table5, FUN=std.error) cc <- merge(aa, ee, by=c("day", "type")) colnames(cc)[3:4] <- c("mean", "se") # 生成与Dunn检验匹配的conditions列 cc$conditions <- paste0(cc$type, cc$day)
步骤3:生成显著性分组字母
运行Dunn检验后,按分组生成对应字母:
# 执行Dunn检验 dunn_result <- dunn.test(table5$TAC, table5$conditions, method = "bh", list = TRUE) # 生成同一type内不同day的小写字母 cc <- cc %>% group_by(type) %>% mutate( lower_letter = cldList(mean ~ day, data = cur_data(), p.value = dunn_result$P[match(paste0(type, day), names(dunn_result$P))])$Letter ) %>% ungroup() # 生成同一day内不同type的大写字母 cc <- cc %>% group_by(day) %>% mutate( upper_letter = cldList(mean ~ type, data = cur_data(), p.value = dunn_result$P[match(paste0(type, day), names(dunn_result$P))])$Letter ) %>% ungroup()
步骤4:在ggplot中添加标注
将两种字母分别标注到对应位置:
ggplot(cc, aes(x = type, y = mean, fill = day))+ geom_bar(stat="identity", position= position_dodge(width=0.8)) + scale_fill_brewer(palette="Paired")+ theme_minimal() + labs(x="", y="ratio", title = "TAC") + theme(panel.background = element_blank(), axis.line = element_line(colour = "black"), panel.grid=element_blank(), plot.title = element_text(size=40, hjust = 0), legend.text = element_text(size=30), legend.title = element_text(size=32), axis.title.x = element_text(size = 36), axis.text.x = element_text(size = 34), axis.title.y = element_text(size = 36), axis.text.y = element_text(size = 28) ) + geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(width=0.8), width=0.3) + # 标注小写字母:同一type内day的差异 geom_text(aes(label = lower_letter), position = position_dodge(width=0.8), y = cc$mean + cc$se + 0.001, size=10) + # 标注大写字母:同一day内type的差异 geom_text(aes(label = upper_letter), position = position_dodge(width=0.8), y = cc$mean + cc$se + 0.003, size=10, fontface="bold")
方案二:手动添加显著性字母
若Dunn检验结果简单,可手动分配字母后直接标注,灵活性更强。
步骤1:手动整理字母映射
根据你的检验结果,给每个day+type组合分配字母:
# 示例映射,需根据实际检验结果修改 letter_map <- data.frame( conditions = c("controlday 00", "controlday 07", "treatAday 00", "treatAday 07"), lower_letter = c("a", "b", "a", "a"), # 同一type内day差异 upper_letter = c("A", "A", "B", "B") # 同一day内type差异 ) # 合并到绘图数据 cc <- merge(cc, letter_map, by="conditions")
步骤2:添加标注到ggplot
直接复用方案一的绘图代码,调用geom_text标注手动分配的字母即可。
注意事项
- 仅需单一维度标注时,删除对应字母的
geom_text代码即可; position_dodge(width=0.8)需与geom_bar的dodge宽度一致,避免字母错位;- 调整
y参数的偏移值(如0.001、0.003),确保字母不与误差条重叠,数值需适配你的数据范围。
内容的提问来源于stack exchange,提问作者Roma JC
相关产品推荐
相关产品推荐

