
可能我们在文章中也有看到这种类似的进化树图,精确度可能只到门级别,常用于展示不同门或类群间的系统发育关系及相对丰度,也好奇这种图是怎么出的,今天就来简单探索下如何批量画出这种图。这种图的典型特征包括:中心点为共同祖先(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