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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:45:46