Cytoscape可視化物種分類樹結構

2021-02-13 生信寶典

前兩天偶然看到了這樣一張圖,聽群友說這是Cytoscape調出來的效果,就想試一試。折騰一番後,發現這個圖的工作量貌似蠻大的。因此本篇就只是概括了一下大致的過程,包括如何準備輸入數據,以及在Cytoscape可視化時大致上要點擊哪些按鈕等,並未仔細琢磨成品圖。所以,下文略顯粗糙,大家有興趣就看吧……

這其實是個物種分類樹,代表的微生物分類。從高級分類水平(界,細菌和真菌)的根節點開始,依次往低分類層級(門綱目科屬等)延伸,逐漸形成分支,末端節點應該是OTU或者種水平。因此,分支呈簇狀展示,分支的顏色主要按門水平著色,將衍生自同一類門的微生物分支賦值相同的顏色。節點的大小應該對應了微生物的豐度,而節點的顏色主要有兩種,猜測紅色代表了一些重要的微生物,白色是不重要的。圖中文字部分則標識了主要的微生物門所含的節點數量,以及這些微生物的總豐度佔比。

好吧,其實白魚同學並不知道這是來自哪篇文章的插圖,不清楚它的任何細節,包括其具體的指代信息以及作者試圖表達的意義等,上一段文字純粹是看圖瞎猜的……又懶得問其來源,那就按照這種理解去模仿吧,反正只是隨手畫個圖嘛,不要在意那麼多細節。

  

示例數據和預處理R代碼的百度盤連結(提取碼,sf9f):

https://pan.baidu.com/s/1nS402FLH3lQu8CNq6JjEsA

 

網盤附件「otu.txt」如下所示,以OTU的豐度為主,後面跟上這些OTU所屬的界門綱目科屬分類。需要事先把一些注釋不明確的物種提前去除(比如unidentified、unknown、others等),否則導致了一些分類關係混亂。然後將它讀到R中,整合各個分類水平的包含關係,即上一級分類和下一級分類的對應列表用作邊列表,並統計共計多少分類類型及其豐度用作節點列表。


#讀入數據
otu <- read.delim('otu.txt', stringsAsFactors = FALSE, check.names = FALSE)

#整合各分類層級和所含物種豐度的嵌套關係,構建網絡邊列表
#source 和 target 分別對應了上下級物種分類層級的對應關係,abundance 表示 target 的豐度
genus_otu <- otu[c('genus', 'otu', 'abundance')]
names(genus_otu) <- c('source', 'target', 'abundance')
family_genus <- aggregate(otu$abundance, by = list(otu$family, otu$genus), FUN = sum)
names(family_genus) <- c('source', 'target', 'abundance')
order_family <- aggregate(otu$abundance, by = list(otu$order, otu$family), FUN = sum)
names(order_family) <- c('source', 'target', 'abundance')
class_order <- aggregate(otu$abundance, by = list(otu$class, otu$order), FUN = sum)
names(class_order) <- c('source', 'target', 'abundance')
phylum_class <- aggregate(otu$abundance, by = list(otu$phylum, otu$class), FUN = sum)
names(phylum_class) <- c('source', 'target', 'abundance')
kingdom_phylum <- aggregate(otu$abundance, by = list(otu$kingdom, otu$phylum), FUN = sum)
names(kingdom_phylum) <- c('source', 'target', 'abundance')

edge_list <- rbind(kingdom_phylum, phylum_class, class_order, order_family, family_genus, genus_otu)

#將各個分類層級對應至 phylum,以便用於在 Cytoscape 中調整樹分支的顏色
otu_phylum <- otu[c('phylum', 'otu')]
names(otu_phylum)[2] <- 'target'
genus_phylum <- otu[c('phylum', 'genus')]
names(genus_phylum)[2] <- 'target'
family_phylum <- otu[c('phylum', 'family')]
names(family_phylum)[2] <- 'target'
order_phylum <- otu[c('phylum', 'order')]
names(order_phylum)[2] <- 'target'
class_phylum <- otu[c('phylum', 'class')]
names(class_phylum)[2] <- 'target'
phylum_phylum <- otu[c('phylum', 'phylum')]
names(phylum_phylum)[2] <- 'target'

tax_phylum <- rbind(phylum_phylum, class_phylum, order_phylum, family_phylum, genus_phylum, otu_phylum)
tax_phylum <- tax_phylum[!duplicated(tax_phylum$target), ]
edge_list <- merge(edge_list, tax_phylum, by = 'target', all.x = TRUE)

#輸出邊列表
edge_list <- edge_list[c('source', 'target', 'abundance', 'phylum')]
edge_list$weight <- 1
head(edge_list)

write.table(edge_list, 'edge_list.txt', row.names = FALSE, sep = '\t', quote = FALSE)


#構建節點列表,包括各個分類水平的名稱,以及所含物種總豐度等
node_list <- reshape2::melt(otu, id = 'abundance')
node_list <- aggregate(node_list$abundance, by = list(node_list$value, node_list$variable), FUN = sum)
names(node_list) <- c('shared name', 'taxonomy', 'abundance')

#原始豐度 abundance 的數值差較大,不利於直接使用該列在 Cytoscape 中定義節點大小
#再指定個新列 abundance2,對原始的 abundance 作些轉換,比如 log 降低高豐度的權重等
node_list$abundance2 <- log(node_list$abundance+1, 2) #log 轉化時加個基數 1

#添加節點的 phylum 水平分類
otu_phylum <- otu[c('phylum', 'otu')]
names(otu_phylum)[2] <- 'shared name'
genus_phylum <- otu[c('phylum', 'genus')]
names(genus_phylum)[2] <- 'shared name'
family_phylum <- otu[c('phylum', 'family')]
names(family_phylum)[2] <- 'shared name'
order_phylum <- otu[c('phylum', 'order')]
names(order_phylum)[2] <- 'shared name'
class_phylum <- otu[c('phylum', 'class')]
names(class_phylum)[2] <- 'shared name'
phylum_phylum <- otu[c('phylum', 'phylum')]
names(phylum_phylum)[2] <- 'shared name'

tax_phylum <- rbind(phylum_phylum, class_phylum, order_phylum, family_phylum, genus_phylum, otu_phylum)
tax_phylum <- tax_phylum[!duplicated(tax_phylum$'shared name'), ]
node_list <- merge(node_list, tax_phylum, by = 'shared name', all.x = TRUE)

#根據事先選擇的一些重要節點名稱,在節點列表中標識出後輸出節點列表
select_node <- read.delim('select_node.txt', stringsAsFactors = FALSE)

node_list[which(node_list$'shared name' %in% select_node$id),'select'] <- 1
node_list[which(! node_list$'shared name' %in% select_node$id),'select'] <- 0
head(node_list)

write.table(node_list, 'node_list.txt', row.names = FALSE, sep = '\t', quote = FALSE)


  

這樣兩個輸入文件就準備好了,分別為上述R輸出的「edge_list.txt」和「node_list.txt」,導入至Cytoscape中進行可視化。

打開Cytoscape後,點擊「Import Network from File System」讀取邊列表,也就是上述輸出的「edge_list.txt」;以及點擊「Import Table from File」讀取節點列表,「node_list.txt」。

文件導入後,Cytoscape中自動呈現一幅網絡圖,這個網絡圖的結構就代表了給定的物種分類樹了。


  

點擊界面左側「Style」按鈕進入外觀調整選項。首先是對邊的調整,點擊下方「Edge」後進入邊樣式調整界面。

已知該網絡代表了物種分類樹,如上所述,從高級分類水平(界)的根節點開始,依次往低分類層級(門綱目科屬等)延伸,逐漸形成分支。因此,下遊的分類分支都衍生自上遊高級分類分支。參考圖中將衍生自同一門分類的微生物分支賦值相同的顏色,這裡我們效仿,在上文的R操作過程中已經對網絡中每條邊做了歸類,邊列表中的「phylum」列就記錄了分支對應的門分類水平。點擊「Stroke Color」,按邊列表中的「phylum」列分配顏色。

邊的顏色是主要的調節屬性。對於其它的屬性,視情況自定義修改。例如如果覺得邊太細,就可以點擊「Width」將邊的尺寸設置的寬一些,使其更清晰。


  

隨後,點擊下方「Network」,將「Background Paint」背景色設置為黑色。


  

然後是對節點的調整,點擊下方「Node」後進入節點樣式調整界面。

對於節點顏色,點擊「Fill Color」,按節點列表中的「select」列分配顏色,將1(標記的重要的微生物)賦值為紅色,0(不重要的)賦值為白色。

對於節點形狀,勾選下方「Lock node width and height」後,點擊「Shape」統一設置為圓形。

對於節點大小,點擊「Size」,按節點列表中的「abundance2」列指定大小。該列是個連續的數值,大值對應大點,小值對應小點。

以及點擊「Properties」顯示出「Label Transparency」選項後統一設置為0,即將節點標籤均設置為透明,以去除節點標籤。


  

上述過程都很簡單,不再多說了,大家看著來設置就行。

最後是調整網絡布局,獲得類似示例圖中的樹狀結構。可以先嘗試一些自動布局,看看哪些布局風格效果較好。下圖展示一些和示例圖較為相似的自動布局,以及一些不相似但是可能有趣的自動布局,供大家參考吧。

點擊菜單欄「Layout」,提供了N種預設布局;此外「Apps」中可以下載更多樣式的插件,例如yFiles布局就是在「Apps」中找的拓展插件之一。



 

這些自動布局也就是有幾分相似而已。一般來說,網絡圖布局光靠自動布局是難以滿足需求的,配合手工調整肯定是免不了的,只是手工調整的過程會很糟心……哦對了,說不定真的有自動布局能夠出來示例圖樣式,只是沒找到而已。

以下簡單展示一個手工調節布局的過程。以「Prefuse Force Directed Layout (按 weight 列定義布局)」布局為例,因為它的微生物節點分類層次不明確,有待手動拖一下。當然,實際情況中儘可能找一個最相似的布局來,這樣可以簡化手動的工作量。點擊「Select」,按微生物節點所屬的門分類水平進行選擇,並將選中的節點拉動至一旁,就可和其它類群分開了。隨後,設法手動選擇節點子集,並拖動將該類群內部的節點的層次結構儘可能區分明顯。

把所有節點的層次關係調整好,將微生物的分類關係較好地呈現出,總之工作量挺大的。所以,白魚同學就沒再繼續,為了一個示例耗費大量時間在裡面就不值得了……本篇教程只是作為方法類指引,幫助大家了解大體上是怎樣的操作過程就可以了。真正有需要時,再花點時間配合手工琢磨布局,再慢1天也能搞定了吧。



  

最後,如果在Cytoscape中調試出了想要的結果,點擊「File > Export > Network to Image」將圖片導出為pdf矢量圖後,放在AI(Adobe Illustrator)中補充文字標籤。例如示例圖中,微生物門水平的名稱、節點數量和所含物種的豐度佔比等,就可以通過AI補充。


 

整體過程大致就這樣吧,最麻煩的在布局調整那一步,其它倒還好。總之真要有待於可視化這樣一張圖的話,有耐心就是了……集中精力,1天差不多也能搞定了

新出爐的Cytoscape視頻教程

Cytoscape製作帶bar圖和pie圖節點的網絡圖

往期精品(點擊圖片直達文字對應教程)

後臺回復「生信寶典福利第一波」或點擊閱讀原文獲取教程合集

 

相關焦點

  • 一網打盡:cytoscape
    目錄簡介1、cytoscape簡介2、cytoscape使用舉例3、圖形美化4、子網提取5、String
  • 使用ggtree實現進化樹的可視化和注釋
    現在主流的方法是最大似然法(Maximum likelihood, ML),通過進化模型(evolutionary model)估計拓樸結構和分支長度,估計的結果具有最高的概率能夠產生觀測數據(多序列比對)。另外還有最大簡約法和貝葉斯推斷等方法用於構建進化樹。
  • 菌群數據的統計和可視化方法
    微生物組研究主要分為三步走,之前已經給大家講解了實驗設計與生信分析的方法(從樣本測序數據到生成物種和功能組成表),那麼接下來為大家介紹菌群測序數據下遊分析的統計和可視化方法,包括多樣性分析、物種組成分析、微生物差異分析、相關性分析、網絡分析、機器學習(構建疾病預測模型)、進化分析、來源分析以及常用可視化方法。
  • 宏基因組注釋和可視化神器MEGAN入門
    MEGAN-宏基因組功能和物種分類MEGAN用於功能和物種分類官網。這裡有付費版和免費版本。我們以免費版為例。第8行針對SEED分類指定展示中圖形樹中的節點分類。這裡除了SEED資料庫,可以用TAXONOMY或KEGG代替,例如其他分類。第9行包含用於計算分類的算法的名稱。第二個是參數。第10行列出了運行參數用於生成文件。第11行指定分類節點的樣式。
  • GraPhlAn:最美進化樹或層級分類樹學習筆記
    是一個可視化進化樹和基於分類等級繪製層級分類樹的工具。可以製作分類樹是它不同於R包ggtree和iTOL的地方。然就進化樹而言,iTOL功能最為全面,ggtree最容易上手,從功能上來講graphlan很多地方不如iTOL,比如,iTOL無限制添加的數據集,外環可以製作各種圖形包括箱線圖等,可以使用多種符號填充外環,但是Graphlan就不能這麼隨便了,只能使用兩個符號填充外環。再多的環屬性也就是設置環數量和顏色,透明度了。
  • cytoscape的cytohubba及MCODE插件尋找子網絡hub基因
    我特別不喜歡寫網頁工具或者滑鼠點點點的軟體操作指南,因為感覺就跟QQ軟體一樣,自己摸索就ok了,所以我的cytoscape十講就一直處於施工階段:每次都是寫到一半,就棄稿了!不過,好在我有一千多學員,一百多個學徒,給他們安排的作業就是寫這些簡單軟體操作指南,這樣就彌補了我寫不來太基礎教程的弱點。
  • 決策樹可視化-python
    ,也容易將其結果進行可視化展示,python中sklearn.tree的export_graphviz函數可以將決策樹結果以doc或dot文件的形式輸出,然後將決策樹結果可視化,下面舉個簡單例子。n_repeated=0, n_classes=2, weights=[0.8, 0.2], flip_y=0.01, random_state=1234)2.訓練決策樹
  • 用Python構建和可視化決策樹
    你根本不需要熟悉機器學習技術就可以理解決策樹在做什麼。決策樹圖很容易解釋。利弊決策樹方法的優點是:決策樹方法的缺點是:決策樹的訓練在計算上可能很昂貴。生成決策樹的過程在計算上非常昂貴。在每個節點上,每個候選拆分欄位都必須進行排序,才能找到其最佳拆分。在某些算法中,使用欄位組合,必須搜索最佳組合權重。剪枝算法也可能是昂貴的,因為許多候選子樹必須形成和比較。
  • 進化樹作圖專題:進化樹的幾種分類
    本期承接上期進化樹作圖專題1的內容,和大家分享一下關於進化樹圖的幾種分類。 依據不同規則,樹的分類可以有很多種。由於本專題主要針對於作圖,所以這裡主要的原則就是——樹的外形。所謂「根」,就是一棵樹上的所有基因或物種的最近共同祖先(most recent common ancestor,MRCA)。
  • NAR:MicrobiomeAnalyst微生物組分析師——統計、可視化和元分析微生物組數據的網頁工具
    一般來說,最好的方法是開發適合鬆散數據結構和不同測序深度的統計模型,或者開發合適的數據轉換方法,使現用數據適合其它算法的數據分布模型。近年來在這些方面有一些重大進展。抽平曲線分析允許用戶可視化觀察測試深度與OTU數據的關係。群體組成物種組成多樣性群體組成主要採用R的phyloseq和vegan包。分析可以在不同分類級進行。alpha多樣性功能目前支持6種多樣性指數。樣本的結果可用箱線圖展示(圖2A)。組間的統計顯著性,用戶可選有參、無參方法計算。用戶也可以採用堆疊面積圖或堆疊柱狀圖展示不同分類級別。Beta多樣性支持5種常用距離。
  • 機器學習決策樹:sklearn分類和回歸
    作者:alg-flody編輯:Emily昨天的推送機器學習:對決策樹剪枝,分析了決策樹需要剪枝,今天再就這個話題,藉助 sklearn 進一步分析決策樹分類和回歸時過擬合發生後,該如何解決的問題。上周推送的機器學習:談談決策樹,介紹了利用邏輯回歸算法,二分類一個擁有2個特徵的數據集,模擬的結果如下所示:
  • 使用Scikit-Learn了解決策樹分類
    決策樹是用於分類和回歸任務的最基本的機器學習工具之一。在這篇文章中,我將介紹-以基尼雜質為標準的決策樹算法拆分原則。決策樹在現實生活數據分類中的應用。創建一個管道,並使用GridSearchCV為分類任務選擇最佳參數。決策樹決策樹(以下簡稱DT)算法的思想是學習一組if/else問題來進行決策。決策樹可以組合數值數據和分類數據。
  • 開源數據可視化工具資源整合
    問答:http://docs.cartodb.com/faqs.html功能簡介CartoDB是一個雲上的地理空間資料庫,允許存儲和可視化web上的數據。教程:http://circos.ca/documentation/tutorials功能簡介Circos是一個軟體包,用於數據和信息可視化。
  • Jeff Dean強推:可視化Bert網絡,發掘語言、語法樹與幾何學
    句子的句法結構是句子語言信息的一個重要組成部分。這個結構可以用樹來表示,它的節點則對應於句子中的單詞。休伊特(Hewitt)和曼寧(Manning)在《一種用於在單詞表示中查找語法的結構探針》中指出,一些語言處理網絡構造了這種語法樹的幾何副本。而單詞是在高維空間中給定的位置,並且(經過一定的轉換)這些位置之間的歐氏距離(Euclidean distance)可以映射到樹的距離。
  • 我寫了一個簡單的進化樹可視化/注釋工具
    提到進化樹可視化/注釋工具,以我個人的認知,那麼現在可能只有兩個優秀的工具。一個是ITOLs,一個是ggtree。前者便不過多說明,是一個網頁工具。而後者則是你Y叔我大溼兄(公眾號:biobabble的運營者)。應是有部分朋友知道我從來就喊你Y叔叫大溼兄,也基本只有我這麼喊(我的意思是,不是每個人都能這麼喊)。
  • 【中國科學報】科學家提出東亞鼠尾草屬物種新分類系統
    【中國科學報】科學家提出東亞鼠尾草屬物種新分類系統 2018-10-15 中國科學報 高雅麗 經過近7年的研究,中國科學院昆明植物研究所植物經典分類與植物多樣性研究團隊東亞特徵成分研究組與日本、美國同行進行深度合作,對東亞鼠尾草物種進行了系統的研究。  近日,該項研究的部分結果發表於植物學期刊《植物學年報》上,並被遴選為封面文章。同時該論文第一作者、博士胡國雄及共同通訊作者、博士向春雷還應邀參加了2018年度美國植物學會年會的鼠尾草屬專題會議。
  • 微生物組16S rRNA數據分析小結:從OTU table到marker物種
    注意本分析是基於OTU table, 樣本的距離矩陣,物種多樣性指數,序列的進化樹及物種注釋信息而非基於序列數據(.fastq等)。包括以下兩個內容:input文件介紹OTU(Operational taxonomic unit),可操作分類單元各OTU的代表序列(.fasta)物種注釋信息物種進化樹各樣本的多樣性指數:α-diversity的input距離矩陣:β-diversity的input
  • 機器學習 | 決策樹之分類樹
    今天推出機器學習系列筆記第1期,本期分享內容為:機器學習之決策樹中的分類樹。(筆者使用的是Mac系統)決策樹(Decision Tree):是一種非參數的有監督學習算法,在已知各種情況發生概率的基礎上,通過構成決策樹來取淨現值的期望值大於等於零的概率,是直觀運用概率分析的圖解法,以解決分類和回歸問題。分為分類樹和回歸樹。
  • 機器學習可視化
    預測表格1.4 決策樹(Decision Tree)決策樹是機器學習模型中最容易解釋的類型之一。由於它們的基礎結構,可以很容易地通過查看樹的不同分支上的條件來檢查算法是如何做出決定的。此外,考慮到算法將決策樹認為對我們所需的分類/回歸任務最有價值的特徵放在樹的頂層,因此決策樹也可以用作特徵選擇技術。這樣,由於攜帶較少的信息,可以丟棄樹底部的特徵。