Tukey检验ggplot箱线图显著性字母显示顺序调整咨询
R语言ggplot绘制Tukey检验箱线图显著性字母错位问题解决
问题原因
你当前代码的核心问题是显著性字母数据集和最大值数据集的基因型顺序未显式对齐:HSD.test返回的groups默认按基因型均值降序排列,直接按行名排序后和ggplot x轴的Genotype因子顺序大概率不一致,直接取sig.letters$groups作为标签就会出现对应错位。
修复步骤
1. 提前设定Genotype因子顺序(对齐x轴显示顺序)
首先把你数据里的Genotype设为因子,水平顺序按你想要的x轴显示顺序设置,第一个水平就是你要标为a的样本:
library(tidyverse) library(agricolae) # 替换levels里的内容为你实际的基因型顺序,第一个为你要放在x轴最左、标为a的样本 Rosettes$Genotype <- factor(Rosettes$Genotype, levels = c("基因型1", "基因型2", "基因型3", "..."))
2. 对齐显著性字母与最大值数据
不要直接单独排序两个数据集,通过合并操作保证每个基因型对应的最大值、显著性字母完全匹配:
# 计算每个基因型的最大值 value_max <- Rosettes %>% group_by(Genotype) %>% summarize(max_value = max(X0.5xMS)) # 计算Tukey检验 hsd <- HSD.test(aov(X0.5xMS~Genotype, data=Rosettes), trt = "Genotype", group = T) # 提取显著性字母并转成可合并的表格 sig_letters_df <- hsd$groups %>% as.data.frame() %>% rownames_to_column("Genotype") # 合并最大值和显著性字母,自动按Genotype对齐 plot_anno_data <- left_join(value_max, sig_letters_df, by = "Genotype")
3. 修改ggplot的geom_text参数
用合并好的注释数据集作为geom_text的数据源,避免错位:
p <- ggplot(data = Rosettes, aes(x = Genotype, y = X0.5xMS)) + geom_boxplot(aes(fill = Genotype)) + stat_boxplot(geom = 'errorbar', width = 0.1) + # 改用合并好的注释数据,label取groups列 geom_text(data = plot_anno_data, aes(x = Genotype, y = max_value + 0.1, label = groups), vjust = 0) + theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text.x = element_text(angle = 90), plot.title = element_text(hjust = 0.5) ) + ggtitle("Rosette Tukey Results \n 0.5xMS") + xlab("Genotype") + ylab("Rosette Area (cm2)") p
内容的提问来源于stack exchange,提问作者Ferga Hamilton
相关产品推荐
相关产品推荐

