如何调整微生物组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
相关产品推荐
相关产品推荐

