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

