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

如何在R语言交互图中添加multcompLetters生成的TukeyHSD结果字母

解决交互图添加TukeyHSD字母标记的问题

核心问题分析

multcompLetters4返回的是嵌套列表结构,无法直接与ggplot数据集匹配,需先整理字母标记的格式,合并到均值数据集后,再添加到交互图中。

完整修正代码

# 加载依赖包
library(car)
library(multcompView)
library(tidyverse)

# 读取数据
poker <- read.csv("poker_skill.csv", header=T)

# 创建含交互项的线性模型
mod1 <- lm(Earnings~Hand + Skill + Hand:Skill, data = poker)
Anova(mod1, type = "3")

# 执行TukeyHSD事后检验
tukey_res <- TukeyHSD(aov(mod1))

# 生成显著性字母标记
Letters <- multcompLetters4(mod1, tukey_res, reversed = TRUE)

# 1. 整理字母标记为可匹配的数据框
letter_df <- as.data.frame(Letters[["Hand:Skill"]]$Letters) %>%
  rownames_to_column(var = "Group") %>%
  # 重命名字母列,注意特殊列名需用反引号包裹
  rename(Letter = `Letters[["Hand:Skill"]]$Letters`) %>%
  # 拆分分组名,提取Hand和Skill信息
  separate(Group, into = c("Hand", "Skill"), sep = ":") %>%
  # 统一因子格式,避免匹配失败
  mutate(Hand = factor(Hand), Skill = factor(Skill))

# 2. 计算分组均值并合并字母数据
pokerInt <- poker %>%
  group_by(Hand, Skill) %>%
  summarise(mean = mean(Earnings), .groups = "drop") %>%
  # 按Hand和Skill匹配字母标记
  left_join(letter_df, by = c("Hand", "Skill"))

# 3. 绘制交互图并添加字母标记
ggplot(poker, aes(x = factor(Hand), y = Earnings, colour = Skill)) +
  geom_point(data = pokerInt, aes(y = mean), size = 3) +
  geom_line(data = pokerInt, aes(y = mean, group = Skill)) +
  # 添加字母标记,偏移量可根据数据调整
  geom_text(data = pokerInt, aes(y = mean + 0.3, label = Letter), 
            size = 4, colour = "black") +
  labs(x = "Poker Hand", y = "Poker Earnings") +
  theme_bw()

关键步骤说明

  • 整理字母数据:从嵌套列表中提取Hand:Skill交互项的字母结果,拆分分组名得到Hand和Skill字段,确保与均值数据集的分组维度一致。
  • 合并数据集:用left_join将字母标记与均值数据按分组匹配,保证每个均值对应正确的显著性字母。
  • 添加字母到图中:通过geom_text将字母放在均值点上方(y = mean + 0.3为偏移量,可根据实际数据调整),避免与数据点重叠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:12:46