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

如何在phyloseq中按宿主物种绘制相对丰度堆叠柱状图

解决phyloseq按宿主物种汇总并归一化到100%的堆叠柱状图问题

方法1:基于phyloseq原生函数处理

先通过merge_samples按宿主物种合并样本,计算分类单元的平均相对丰度,再重新归一化每个宿主的丰度总和为100%:

library(phyloseq)
library(ggplot2)

# 按host_species合并样本,计算分类单元的平均相对丰度
ps.host <- merge_samples(glom3, group = "host_species")
# 对合并后的样本重新归一化,确保每个宿主的丰度总和为100%
ps.host.rel <- transform_sample_counts(ps.host, function(x) x/sum(x)*100)
# 转换为melt格式用于绘图
ps.host.melt <- psmelt(ps.host.rel)

# 绘制堆叠柱状图
ggplot(ps.host.melt, aes(x = Sample, y = Abundance, fill = Genus1pct)) +
  geom_col(position = "stack") +
  labs(x = "宿主物种", y = "相对丰度 (%)", fill = "属水平分类单元") +
  theme_bw()

方法2:基于dplyr直接处理melt后的数据

如果更习惯用数据框操作,可以直接对已有的ps.melt3分组计算均值,再按宿主归一化:

library(dplyr)
library(ggplot2)

# 按宿主和分类单元分组计算平均丰度,再归一化到100%
host_norm <- ps.melt3 %>%
  group_by(host_species, Genus1pct) %>%
  summarise(mean_abund = mean(Abundance), .groups = "drop") %>%
  group_by(host_species) %>%
  mutate(norm_abund = mean_abund / sum(mean_abund) * 100) %>%
  ungroup()

# 绘制堆叠柱状图
ggplot(host_norm, aes(x = host_species, y = norm_abund, fill = Genus1pct)) +
  geom_col(position = "stack") +
  labs(x = "宿主物种", y = "相对丰度 (%)", fill = "属水平分类单元") +
  theme_bw()

关键说明

  • 两种方法核心逻辑一致:先计算同宿主下各分类单元的平均相对丰度,再对每个宿主的所有分类单元丰度重新归一化,确保总和为100%。
  • 直接以host_species为x轴绘制原始ps.melt3的问题在于,每个样本已经是100%,堆叠后单个宿主的柱子高度是样本数×100%,不符合需求;而先取均值再归一化,就能让每个宿主的柱子高度统一为100%。

内容的提问来源于stack exchange,提问作者Christoffer Bugge Harder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:43:27