如何让显著性字母(cld letters)与有序柱状图顺序一致?
问题与解决方案
问题核心
能独立完成按指定顺序绘制柱状图和生成正确的显著性cld字母,但将字母添加到柱状图时,字母顺序与柱状图的物种顺序不匹配。
数据结构
structure(list(Species = c("Lobaria pulmonaria", "Lobaria pulmonaria", "Lobaria pulmonaria", "Ramalina calicaris", "Ramalina calicaris", "Ramalina calicaris", "Sticta limbata", "Sticta limbata", "Sticta limbata", "Sticta sylvatica", "Sticta sylvatica", "Sticta sylvatica", "Lobaria virens", "Lobaria virens", "Lobaria virens", "Hypotrachyna laevigata", "Hypotrachyna laevigata", "Hypotrachyna laevigata", "Pectenia atlantica", "Pectenia atlantica", "Pectenia atlantica"), NP_WC_optimal = c(21.3618237198417, 15.5845298075442, 31.25636339425, 12.95027982548, 11.5492605388886, 13.8964065715251, 23.1619245358907, 53.7708744850057, 50.4182471232504, 18.7436272362963, 21.035699567449, 11.5011803500647, 1.59102057224244, 11.6565164302693, 9.06852286490795, 8.63444946787104, 8.41753904659996, 12.5181232114049, 4.79683342567531, 3.4023650553992, 11.2043763064991 )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -21L))
问题根源
生成cld字母时,结果默认按物种名称的字母顺序排列;而绘图时使用了自定义的物种顺序,两者的因子水平顺序不统一,导致字母与柱状图错位。
修正步骤与代码
1. 统一所有数据集的物种因子顺序
先确定你需要的柱状图顺序(示例为按均值降序,可替换为自定义顺序),然后将原始数据、汇总数据的Species列统一设置为该顺序的因子:
# 计算汇总数据并按目标顺序排序(示例:按DR均值降序) dtDR <- Cardinal_points_TABLE222 %>% group_by(Species) %>% summarise(DR = mean(DR_WC_optimal), sd = sd(DR_WC_optimal)) %>% arrange(desc(DR)) # 此处可替换为你的自定义排序逻辑 # 将汇总数据的Species设置为指定顺序的因子 dtDR$Species <- factor(dtDR$Species, levels = dtDR$Species) # 同步原始数据的Species因子水平顺序 Cardinal_points_TABLE222$Species <- factor(Cardinal_points_TABLE222$Species, levels = levels(dtDR$Species))
2. 重新生成显著性字母并匹配到汇总数据
确保ANOVA分析和cld字母生成基于统一因子顺序的数据集,再通过物种名称匹配字母:
# 重新执行方差分析与Tukey检验 anovaDR <- aov(DR_WC_optimal ~ Species, data = Cardinal_points_TABLE222) tukeyDR <- TukeyHSD(anovaDR) cldDR <- multcompLetters4(anovaDR, tukeyDR) # 提取cld字母并转换为可匹配的数据框 cld_df <- as.data.frame(cldDR$Species) cld_df$Species <- rownames(cld_df) # 加入物种名称列用于匹配 # 按物种名称合并汇总数据与cld字母,确保顺序完全对应 dtDR <- dplyr::left_join(dtDR, cld_df, by = "Species")
3. 绘制带正确显著性字母的柱状图
此时x轴顺序和字母顺序已统一,直接绘图即可:
ggplot(data = dtDR, aes(x = Species, y = DR, colour = Species, fill = Species)) + geom_bar(stat = "identity") + geom_errorbar(aes(ymin = DR - sd, ymax = DR + sd), width = 0.2, color = "grey15") + geom_text(aes(label = Letters, y = DR + sd), vjust = -0.5, colour = "grey16") # 调整vjust可控制字母上下位置
额外注意事项
- 避免在
group_by中临时转换factor(Species),这会重置因子顺序,导致后续匹配出错。 - 若使用自定义顺序(非均值排序),只需将
arrange(desc(DR))替换为自定义的排序向量,比如levels = c("Sticta limbata", "Lobaria pulmonaria", ...)。
内容的提问来源于stack exchange,提问作者user21264596
相关产品推荐
相关产品推荐

