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

使用emmeans::cld()设置delta=2时,ggplot2箱线图字母错位求助

解决emmeans::cld(delta=2)生成的显著性字母与ggplot2箱线图错位问题

问题描述

使用emmeans::cld()设置delta=2生成显著性分组字母后,在ggplot2箱线图上方展示时,字母与x轴类别出现错位;但设置alpha=0.05时显示正常。已确认主数据集和汇总表的因子水平顺序一致,尝试position=position_identity()后仍存在偏移。

解决方案

问题根源在于cld()使用delta参数时,会默认对emmeans结果按均值排序,即使后续重新设置因子水平,ggplot内部的因子数值编码已被改变。只需在cld()调用中添加sort=FALSE,强制保持原始因子顺序即可解决。

修改后的完整代码

# 加载所需包
library(tidyverse)
library(emmeans)
library(multcomp)

# 步骤1:模拟数据集
set.seed(123)

# 定义处理变量水平
treatment_levels <- c("Control_0",
                      "Carvone_0.001", "Carvone_0.01",
                      "Eucalyptol_0.001", "Eucalyptol_0.01",
                      "Mint_nanah_0.001", "Mint_nanah_0.01",
                      "Mint_piperita_0.001", "Mint_piperita_0.01",
                      "Mint_pouliot_0.001", "Mint_pouliot_0.01",
                      "Menthone_0.001", "Menthone_0.01",
                      "Pulegone_0.001", "Pulegone_0.01")

# 模拟数据集
Microbio_2025 <- tibble(
  Treatment = rep(treatment_levels, each = 6),
  Corrected_Surface = rnorm(6 * length(treatment_levels), mean = 20, sd = 5)
)

Microbio_2025 <- Microbio_2025 %>%
  mutate(Treatment = factor(Treatment, levels = treatment_levels))

# 步骤2:ANOVA模型
anova_microbio <- aov(Corrected_Surface ~ Treatment, data = Microbio_2025)

# 步骤3:生成显著性分组字母(关键修改:添加sort=FALSE)
grouped_means <- emmeans(anova_microbio, specs = ~ Treatment) %>%
  cld(delta = 2, 
      #alpha = 0.05, 
      Letters = letters,
      sort = FALSE) %>%  # 强制保持原始因子顺序
  as.data.frame() %>%
  mutate(Treatment = factor(Treatment, levels = treatment_levels))

# 步骤4:绘制箱线图+显著性字母
ggplot(data = Microbio_2025, aes(x = Treatment, y = Corrected_Surface, fill = Treatment)) +
  
  geom_boxplot(show.legend = FALSE) +
  
  # 添加显著性分组字母,现在对齐正常
  geom_text(data = grouped_means,
            aes(x = Treatment, y = 45, label = .equiv.set),
            position = position_identity(),
            size = 5,
            show.legend = FALSE) +
  
  labs(x = "测试样本",
       y = "校正表面积 (cm²)") +
  
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5),
        text = element_text(size = 15))

关键说明

  • sort=FALSE的作用:阻止cld()对emmeans结果按均值排序,确保分组结果的顺序与原始因子水平完全匹配,避免ggplot映射时出现错位。
  • 无需调整其他参数,保持position=position_identity()即可让字母与对应x轴类别精准对齐。

内容的提问来源于stack exchange,提问作者Indy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:31:01