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

如何将TukeyHSD分析结果绘制成热图?附R语言示例代码

将TukeyHSD分析结果绘制成热图的实现方法

当然可以把TukeyHSD的多重比较结果以热图形式呈现,核心是先把TukeyHSD的输出整理成热图所需的矩阵格式(分组作为行/列,比较指标如校正后p值作为填充值),再用绘图工具实现。以下是基于你提供的代码的完整实现:

完整代码示例

# 加载所需包
library(tidyr)
library(pheatmap)
library(viridis)
library(ggplot2)

# 生成数据
set.seed(0)
data <- data.frame(group = rep(c("A", "B", "C"), each = 30),
                   values = c(runif(30, 0, 3),
                              runif(30, 0, 5),
                              runif(30, 1, 7)))

# 拟合单因素ANOVA模型
model <- aov(values~group, data=data)

# 执行TukeyHSD检验
tukey_result <- TukeyHSD(model, conf.level=.95)

# --------------- 方法1:用pheatmap绘制热图 ---------------
# 将TukeyHSD结果转换为数据框并拆分分组
tukey_df <- as.data.frame(tukey_result$group)
tukey_df$comparison <- rownames(tukey_df)
tukey_df <- separate(tukey_df, comparison, into = c("group1", "group2"), sep = "-")

# 整理为热图所需的矩阵格式(包含所有分组组合)
heatmap_data <- tukey_df %>%
  select(group1, group2, p.adj) %>%
  # 添加反向比较的行(如B-A对应A-B)
  bind_rows(tukey_df %>% mutate(group1 = group2, group2 = group1, p.adj = p.adj)) %>%
  # 添加组内比较的行(p值为1)
  bind_rows(data.frame(group1 = unique(data$group), group2 = unique(data$group), p.adj = 1)) %>%
  pivot_wider(names_from = group2, values_from = p.adj) %>%
  column_to_rownames("group1")

# 绘制热图
pheatmap(heatmap_data, 
         main = "TukeyHSD多重比较校正后p值热图",
         color = viridis(100),
         display_numbers = TRUE,
         number_color = "white")

# --------------- 方法2:用ggplot2绘制热图 ---------------
# 生成所有分组组合
all_groups <- unique(data$group)
all_combinations <- expand.grid(group1 = all_groups, group2 = all_groups, stringsAsFactors = FALSE)

# 合并p值数据(包含正向、反向及组内比较)
ggplot_data <- left_join(all_combinations, tukey_df %>% select(group1, group2, p.adj), by = c("group1", "group2")) %>%
  left_join(all_combinations, tukey_df %>% select(group1 = group2, group2 = group1, p.adj), by = c("group1", "group2")) %>%
  mutate(p.adj = ifelse(!is.na(p.adj.x), p.adj.x, p.adj.y)) %>%
  mutate(p.adj = ifelse(group1 == group2, 1, p.adj))

# 绘制热图
ggplot(ggplot_data, aes(x = group1, y = group2, fill = p.adj)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(p.adj, 4)), color = "white") +
  scale_fill_viridis_c(option = "viridis", name = "校正后p值") +
  labs(title = "TukeyHSD多重比较校正后p值热图", x = "", y = "") +
  theme_minimal()

关键说明

  • 我们选择**校正后p值(p.adj)**作为热图的填充指标,你也可以替换为差异值(diff)、置信区间上下限等其他指标
  • 两种方法都补全了所有分组组合(包括反向比较和组内比较),保证热图的对称性和完整性
  • viridis配色方案相比默认配色更友好,也更适合色盲人群

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:50:25