
可能我們在文章中也有看到這種類似的進化樹圖,精確度可能只到門級別,常用于展示不同門或類群間的系統(tǒng)發(fā)育關系及相對豐度,也好奇這種圖是怎么出的,今天就來簡單探索下如何批量畫出這種圖。這種圖的典型特征包括:中心點為共同祖先(root);向外分支展示各主要門或類群;每個分支下再展開子類群;不強調系統(tǒng)發(fā)育距離的精確比例,而重在分類層次結構與相對多樣性可視化。
當然,首先是獲得進化樹的樹文件,后續(xù)的美化咱可以有各種教程可以參考,發(fā)現比較方便的方法還是從NCBI獲得,Common Taxonomy Tree。但是,NCBI taxa那個網站不太好批量處理的感覺。特別是想畫所有細菌門這種情況時,于是AI輔助整個腳本解決一下!NCBI 本身維護了一個層次化的物種分類體系(Taxonomy Database),但它不是基于系統(tǒng)發(fā)育樹構建的進化樹,而是分類學層級關系(taxonomic hierarchy)。
以下是只保留門節(jié)點的進化樹的代碼:
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)
# 構建門級系統(tǒng)發(fā)育樹
tree = ncbi.get_topology(phylum_taxa)
# 給節(jié)點添加標簽(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) 下載完整的細菌系統(tǒng)樹。https://data.gtdb.ecogenomic.org/releases/latest/bac120.tree.gz