如何用phyloseq绘制带显著性标记的alpha多样性格式化网格图?
解决方案:构建Alpha多样性网格图(带独立Y轴与显著性标记)
方法一:手动整理数据+ggplot分面(推荐)
这种方法通过统一整理数据,利用ggplot的分面功能实现3行(多样性指标)×3列(分组变量)的网格,同时支持每个子图独立设置Y轴。
步骤1:提取并整理数据
# 加载所需包 library(phyloseq) library(tidyr) library(dplyr) # 提取目标Alpha多样性指标 alpha_div <- estimate_richness(your_physeq_object, measures = c("Shannon", "Observed", "InvSimpson")) # 合并样本分组信息(替换为你实际的分组列名) sample_meta <- as.data.frame(sample_data(your_physeq_object)) alpha_div$SampleID <- rownames(alpha_div) sample_meta$SampleID <- rownames(sample_meta) alpha_combined <- merge(alpha_div, sample_meta, by = "SampleID") # 转换为长格式,适配分面需求 alpha_long <- alpha_combined %>% # 将三个分组变量转为键值对 pivot_longer(cols = c(body_site, gender, pregnancy_status), # 替换为你的分组列名 names_to = "Group", values_to = "Group_Level") %>% # 将三个多样性指标转为键值对 pivot_longer(cols = c(Shannon, Observed, InvSimpson), names_to = "Measure", values_to = "Alpha_Value")
步骤2:计算显著性标记
library(rstatix) # 计算每个分组-指标组合的整体显著性,同时获取子图Y轴上限用于放置标记 sig_stats <- alpha_long %>% group_by(Group, Measure) %>% # 非正态分布用kruskal检验,正态分布替换为anova_test kruskal_test(Alpha_Value ~ Group_Level) %>% add_significance() %>% mutate(Signif_Label = case_when( p < 0.001 ~ "***", p < 0.01 ~ "**", p < 0.05 ~ "*", TRUE ~ "ns" )) %>% left_join(alpha_long %>% group_by(Group, Measure) %>% summarise(Max_Y = max(Alpha_Value, na.rm = TRUE) * 1.1), by = c("Group", "Measure")) # 若需要两两比较的连线标记,计算两两检验结果 pairwise_sig <- alpha_long %>% group_by(Group, Measure) %>% pairwise_wilcox_test(Alpha_Value ~ Group_Level, p.adjust.method = "fdr") %>% add_significance() %>% left_join(alpha_long %>% group_by(Group, Measure) %>% summarise(Max_Y = max(Alpha_Value, na.rm = TRUE) * 1.2), by = c("Group", "Measure"))
步骤3:绘制网格图
library(ggplot2) library(ggsignif) # 基础箱线图+整体显著性标记 p <- ggplot(alpha_long, aes(x = Group_Level, y = Alpha_Value)) + geom_boxplot(fill = "#4292c6", alpha = 0.7) + geom_text(data = sig_stats, aes(x = median(1:n_distinct(Group_Level)), y = Max_Y, label = Signif_Label), size = 5, fontface = "bold") + facet_grid(Measure ~ Group, scales = "free_y") + # scales="free_y"实现子图独立Y轴 theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1), panel.grid = element_blank()) # 若添加两两比较连线,替换为以下代码 p <- ggplot(alpha_long, aes(x = Group_Level, y = Alpha_Value)) + geom_boxplot(fill = "#4292c6", alpha = 0.7) + geom_signif(data = pairwise_sig, aes(xmin = group1, xmax = group2, annotations = Signif, y_position = Max_Y), manual = TRUE, tip_length = 0.01) + facet_grid(Measure ~ Group, scales = "free_y") + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1), panel.grid = element_blank()) print(p)
方法二:Patchwork拼接独立图(适合已生成单图的场景)
如果你已经单独生成了每个指标-分组组合的带显著性标记的图,可使用patchwork包将9张图按3×3网格拼接,保留每个图的独立Y轴设置。
library(patchwork) # 假设你已生成以下9张图(替换为你实际的图对象名) # Shannon相关:p_shannon_site, p_shannon_gender, p_shannon_preg # Observed相关:p_observed_site, p_observed_gender, p_observed_preg # InvSimpson相关:p_invsimp_site, p_invsimp_gender, p_invsimp_preg # 按行拼接网格 (p_shannon_site + p_shannon_gender + p_shannon_preg) / (p_observed_site + p_observed_gender + p_observed_preg) / (p_invsimp_site + p_invsimp_gender + p_invsimp_preg) + plot_layout(guides = "collect") # 统一图例,避免重复
关键说明
facet_grid(..., scales = "free_y")是实现子图独立Y轴的核心,避免了统一ylim导致的显示异常。- 显著性检验方法可根据数据分布调整:正态分布用
t.test/anova_test,非正态用wilcox_test/kruskal_test。 - Patchwork拼接法自由度更高,适合需要对单个子图做特殊调整的场景。
内容的提问来源于stack exchange,提问作者EMB
相关产品推荐
相关产品推荐

