只有菌名如何繪制進化樹?


可能我們在文章中也有看到這種類似的進化樹圖,精確度可能只到門級別,常用于展示不同門或類群間的系統(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

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容