只有菌名如何绘制进化树?


可能我们在文章中也有看到这种类似的进化树图,精确度可能只到门级别,常用于展示不同门或类群间的系统发育关系及相对丰度,也好奇这种图是怎么出的,今天就来简单探索下如何批量画出这种图。这种图的典型特征包括:中心点为共同祖先(root);向外分支展示各主要门或类群;每个分支下再展开子类群;不强调系统发育距离的精确比例,而重在分类层次结构与相对多样性可视化。
当然,首先是获得进化树的树文件,后续的美化咱可以有各种教程可以参考,发现比较方便的方法还是从NCBI获得,Common Taxonomy Tree。但是,NCBI taxa那个网站不太好批量处理的感觉。特别是想画所有细菌门这种情况时,于是AI辅助整个脚本解决一下!NCBI 本身维护了一个层次化的物种分类体系(Taxonomy Database),但它不是基于系统发育树构建的进化树,而是分类学层级关系(taxonomic hierarchy)。
以下是只保留门节点的进化树的代码:

from ete3 import NCBITaxa

ncbi = NCBITaxa()

# 若本地数据库未初始化或较久未更新,可启用此行更新
# ncbi.update_taxonomy_database()

# 获取细菌和古菌的所有后代
bacteria = ncbi.get_descendant_taxa('Bacteria', intermediate_nodes=True)
archaea = ncbi.get_descendant_taxa('Archaea', intermediate_nodes=True)

# 合并两部分
all_taxa = bacteria + archaea

# 筛选出“门”级别的taxid
phylum_taxa = []
for taxid in all_taxa:
    rank = ncbi.get_rank([taxid])[taxid]
    if rank == 'phylum':
        phylum_taxa.append(taxid)

# 构建门级系统发育树
tree = ncbi.get_topology(phylum_taxa)

# 给节点添加标签(phylum名称)
for node in tree.traverse():
    if node.is_leaf():
        name = ncbi.get_taxid_translator([int(node.name)])[int(node.name)]
        node.name = name  # 替换为学名

# 输出 Newick 文件
tree.write(format=1, outfile="bacteria_archaea_phylum_tree.nwk")

print(f"提取到 {len(phylum_taxa)} 个门级分类,已输出为 bacteria_archaea_phylum_tree.nwk")

itol查看下这个树:


当然,也可以从 GTDB (Genome Taxonomy Database) 下载完整的细菌系统树。https://data.gtdb.ecogenomic.org/releases/latest/bac120.tree.gz

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容