如何将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
相关产品推荐
相关产品推荐

