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

如何调整微生物组plot_composition绘图结果排序?解决改名后分类消失问题

如何调整phyloseq plot_composition的分类排序并避免"Other"分类消失?

你遇到的问题是因为手动修改phyloseq对象时破坏了otu表和分类表的一致性,导致"Other"分类被错误移除。下面是两种更稳妥的解决思路:

方法一:直接指定绘图时的分类顺序(无需修改原phyloseq对象)

这种方法最简单,不需要改动phyloseq的内部结构,直接在绘图时通过scale_fill_brewer的limits参数指定分类的显示顺序,把"Other"放到最后:

# 提取当前所有Phylum分类名称
phylum_list <- unique(as.character(tax_table(ps1.com.fam.rel)[, "Phylum"]))
# 重新排列顺序:把"Other"移到末尾
sorted_phyla <- c(phylum_list[phylum_list != "Other"], "Other")

# 绘图时应用排序
svg(file="phylum_sorted.svg")
plot_composition(ps1.com.fam.rel) + 
  theme(legend.position = "bottom") + 
  scale_fill_brewer("Phylum", palette = "Paired", limits = sorted_phyla) + 
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +  # 优化x轴标签显示位置
  ggtitle("Relative abundance") + 
  theme(legend.title = element_text(size = 18))
dev.off()

方法二:安全修改"Other"名称为"Z_Other"(确保phyloseq对象一致性)

如果你一定要通过重命名来实现排序,必须保证otu表和分类表的行名、分类信息完全匹配,否则会出现分类消失的问题。正确的修改步骤如下:

# 复制原对象,避免修改原始数据
ps_renamed <- ps1.com.fam.rel

# 1. 修改tax_table中的分类信息
tax_df <- as.data.frame(tax_table(ps_renamed))
# 替换Phylum列的"Other"为"Z_Other"
tax_df$Phylum <- ifelse(tax_df$Phylum == "Other", "Z_Other", tax_df$Phylum)
# 如果有unique列,同步替换
if ("unique" %in% colnames(tax_df)) {
  tax_df$unique <- ifelse(tax_df$unique == "Other", "Z_Other", tax_df$unique)
}

# 2. 修改otu_table和tax_table的行名(必须保持一致)
new_rownames <- rownames(otu_table(ps_renamed))
new_rownames[new_rownames == "Other"] <- "Z_Other"
rownames(otu_table(ps_renamed)) <- new_rownames
rownames(tax_df) <- new_rownames

# 3. 将修改后的分类表重新赋值回phyloseq对象
tax_table(ps_renamed) <- as.matrix(tax_df)

# 现在绘图,"Z_Other"会因为首字母Z自动排在末尾
svg(file="0_1phylum_BMP_sorted.svg")
plot_composition(ps_renamed) + 
  theme(legend.position = "bottom") + 
  scale_fill_brewer("Phylum", palette = "Paired") + 
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) + 
  ggtitle("Relative abundance") + 
  theme(legend.title = element_text(size = 18))
dev.off()

为什么你的原代码会导致分类消失?

你在修改otu_table时犯了一个关键错误:先修改了otu_table(ps1.com.fam.rel)的行名,随后又把未修改行名的essai(原otu表的data.frame)重新赋值回去,这就覆盖了你之前修改的行名,导致otu表和分类表的行名不匹配,phyloseq无法识别这个分类单元,最终导致"Other"从绘图中消失。

内容的提问来源于stack exchange,提问作者Julie Hardy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:07:50