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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:12:38