繼續(xù)之前還沒有完成的內(nèi)容形病。因?yàn)樽罱趯W(xué)習(xí)Y叔的R包--ggtree誊涯,所以就順便拿這個(gè)內(nèi)容來進(jìn)行展示侍匙,作為一個(gè)例子來記錄迈喉。nwk樹文件和R代碼文件我已經(jīng)放在github:https://github.com/Lxmic/ggtree_note
1. ggtree安裝
關(guān)于這個(gè)包集歇,y叔已經(jīng)寫了相當(dāng)詳細(xì)的說明桶略,有一個(gè)完整的電子書《Data Integration, Manipulation and Visualization of Phylogenetic Trees》。這個(gè)包是在Bioconductor上面诲宇,有非常詳細(xì)的介紹际歼,可以去查找相關(guān)的內(nèi)容。
#安裝相關(guān)的包姑蓝,包括ggtree以及ggplot2
#對(duì)于R版本在3.6及以上的鹅心,需要使用BiocManager包來安裝bioconductor上的包
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("ggtree")
#ggplot2安裝
install.packages("ggplot2")
#載入兩個(gè)包
library(ggplot2)
library(ggtree)
2. 讀取及可視化樹結(jié)構(gòu)
關(guān)于用什么算法以及什么軟件來構(gòu)建你自己需要的樹,完全看個(gè)人的需要纺荧,y叔在電子文檔《Data Integration, Manipulation and Visualization of Phylogenetic Trees》中有很詳細(xì)的介紹各種樹以及各種算法旭愧,有興趣了解一下(反正我是看不太懂)。我就用最簡(jiǎn)單宙暇,最常用的方法來獲得進(jìn)化樹——MEGA軟件榕茧,可以輸出newick格式的樹,非常常用的進(jìn)化樹文件(我們需要保存其bootstrap值以及branch.length值)客给。
# 讀取newick樹用押,在當(dāng)前工作目錄中的nramp.nwk文件,并賦值給tree
tree <- read.newick("nramp.nwk")
# 可視化樹結(jié)構(gòu)靶剑,這里用環(huán)形樹來展示
p1 <- ggtree(tree, layout = "circular", branch.length = "none")
# 將進(jìn)化樹打印出來顯示
print(p1)
# 如果要將branch.length展示蜻拨,那么只需要?jiǎng)h除branch.length = "none"
p2 <- ggtree(tree, layout="circular")
# 可以看到,目前的進(jìn)化樹還沒有tiplab桩引,因此我們需要添加lab缎讼,跟ggplot2一樣,再添加一個(gè)圖層坑匠,就可以實(shí)現(xiàn)血崭。
p3 <- p1 + geom_tiplab2(color="seagreen", size = 3, hjust = -.2)+xlim(NA, 22)
print(p3)
# 此外,我們通常需要給樹的某個(gè)node來添加背景色高亮顯示,也只需要通過一個(gè)函數(shù)添加圖層夹纫。一般首先我們要了解節(jié)點(diǎn)ID咽瓷,要知道你需要高亮顯示的節(jié)點(diǎn)。
#顯示進(jìn)化樹的節(jié)點(diǎn)ID
p4 <- p3 + geom_text2(aes(label=node))
print(p4)
#為一部分樹添加背景顏色舰讹,著重顯示
p5 <- p3 + geom_hilight(node = 33, fill = "red", alpha = 0.6)
print(p5)
#打印所有圖片茅姜,這里還需要安裝一個(gè)cowplot包,用來排版的
install.packages("cowplot")
plot_grid(p1, p2, p3, p4 ,p5, ncol=3, labels=c("A","B", "C", "D", "E"))
3. 進(jìn)化樹修飾
對(duì)于iTOLs這個(gè)進(jìn)化樹修飾軟件月匣,雖然功能也強(qiáng)大钻洒,但是我本身用起來還是覺得很費(fèi)事,而且各種配置文件很多锄开,感覺有點(diǎn)頭大素标,真是傷不起,重復(fù)性不高萍悴。由于這個(gè)原因糯钙,我還是決定學(xué)習(xí)R包-ggtree,今天就進(jìn)一步來修飾一下進(jìn)化樹退腥,使其變得更加美觀一些。用代碼來修飾進(jìn)化樹再榄,重復(fù)性可想而知狡刘,非常節(jié)省時(shí)間。
-對(duì)一些參數(shù)進(jìn)行說明
函數(shù)geom_tiplab2()
是用來添加taxa的label的困鸥,也就是你的基因名嗅蔬。還有一個(gè)基本相同的用來給矩形樹添加label的geom_tiplab()
。這兩個(gè)函數(shù)區(qū)別在前者可以根據(jù)樹來自動(dòng)調(diào)整角度疾就,來達(dá)到比較好的可讀性澜术。我這里畫的圈圖,就適合用前者猬腰。
# 這個(gè)p6跟上面的圖C是一樣的鸟废,就是我改變來它的xlim的范圍,為了后面添加strip姑荷,需要控制xlim盒延。
# size是字體大小,color是字體顏色鼠冕,hjust是距離節(jié)點(diǎn)的距離添寺。
p6 <- ggtree(tree, layout = "circular", branch.length = "none")
+geom_tiplab2(color = "seagreen", size=3, hjust=-.05)
+ xlim(NA, 20)
print(p6)
p61 <- ggtree(tree, layout = "circular", branch.length = "none", )+geom_tiplab2(color = "red", size=2, hjust=-.1)+ xlim(NA, 20)
print(p61)
plot_grid(p6, p61, ncol = 2, labels = c("F","G"))
- 進(jìn)化樹基本都會(huì)聚類成幾個(gè)分支,對(duì)于基因家族懈费,就可以相應(yīng)的進(jìn)行亞家族分類计露,下面就用文獻(xiàn)中常見的strip來將進(jìn)化樹進(jìn)一步分類。在
ggtree
中對(duì)應(yīng)的函數(shù)是geom_strip()
,下面我們來看具體的代碼以及參數(shù)票罐。 -
geom_strip()
函數(shù)可以在進(jìn)化樹的外圍來添加具有色彩的條帶叉趣。根據(jù)圖d中的節(jié)點(diǎn),我們來進(jìn)行相應(yīng)的添加胶坠。其中的前兩個(gè)數(shù)字就是對(duì)應(yīng)的節(jié)點(diǎn)(taxa1
和taxa2
)君账,從起始到結(jié)束。barsize
就是色塊的寬度沈善, 以及color
就是色塊顏色乡数。 -
offset
就是距離節(jié)點(diǎn)的位置,這個(gè)參數(shù)就需要和之前的xlim
進(jìn)行配合闻牡,才能夠?qū)⑸珘K放到合適的位置净赴,不會(huì)和tiplab
互相覆蓋。這里的label
就是色塊想塊的名字罩润,也就分類名例如Clade I這種玖翅。 -
offset.text
這個(gè)參數(shù)是來調(diào)整label的位置的,它的起始位置就是strip開始的割以,而不是taxa開始的金度。extend
是用來調(diào)整色塊之間的間隔大小,默認(rèn)是0严沥;如果是0.5的話猜极,那么正好可以將色塊拼接成一個(gè)完整的圈。 -
angle
是用來調(diào)整label
的角度, 默認(rèn)是0消玄,順時(shí)針就是正的數(shù)值跟伏。align
在這里似乎沒有什么作用。 -
hjust= "center"
的作用就是將label放置在strip的中間位置翩瓜。這么以來受扳,基本所有的問題就解決來,可以直接出比較好看的圈圖兔跌。
p7 <- p6
+ geom_strip(14, 17, barsize = 3, color = "steelblue", offset = 7, label = "Clade I", offset.text = 1, angle = 60, fontsize = 4, hjust = "center", extend = 0.3)
+ geom_strip(11, 13, color = "red", barsize = 3, offset = 7, label = "Clade II", offset.text = 1, angle = -15, fontsize = 4, hjust = "center", extend = 0.3)
+ geom_strip(6, 9, color = "orange", barsize = 3, offset = 7, label = "Clade III", offset.text = 1, angle = 10, fontsize = 4, hjust = "center", extend = 0.3)
print(p7)
這里我有一個(gè)問題勘高,就是說我還不知道對(duì)于里面只有一個(gè)基因的node,我該怎么給它添加strip坟桅,因?yàn)?code>geom_strip()這個(gè)函數(shù)是需要兩個(gè)taxa來添加的相满,只有一個(gè)的條件下,我沒有辦法桦卒。而且我嘗試過將
taxa1 = taxa2
立美,還是沒有起作用。我已經(jīng)在ggtree group中提出來問題方灾,希望能得到解答
分組給分支上色
在別人的文章中建蹄,也經(jīng)常會(huì)看到將tiplabel分為不同的顏色來進(jìn)行上色碌更,以更好的區(qū)分不容的clade。例如這篇jxb關(guān)于楊樹mate家族基因分析的文章(doi:10.1093/jxb/erx370)洞慎,進(jìn)化樹的展示:
這里我先用比較麻煩的辦法來實(shí)現(xiàn)它痛单。我們只需要自己構(gòu)建一個(gè)顏色文件,然后強(qiáng)行插入到樹文件中并進(jìn)行可視化就可以完成劲腿。
-
構(gòu)建一個(gè)顏色文件旭绒, 只要包含兩個(gè)參數(shù)就行——node和color,和之前的進(jìn)化樹的node 號(hào)一一對(duì)應(yīng)起來焦人。這樣的格式就可以了挥吵。
- 讀取這個(gè)顏色文件,我習(xí)慣用
read.csv()
來載入外部數(shù)據(jù)花椭。
#讓進(jìn)化樹著色忽匈,變成自己需要的顏色。先根據(jù)節(jié)點(diǎn)矿辽,構(gòu)建自己的顏色數(shù)據(jù)框
d <- read.csv("nramp_color.csv", header = TRUE)
d <- data.frame(d)
#使用`%<+%`符號(hào)強(qiáng)插入顏色數(shù)據(jù)到樹文件中
p8 <- p7%<+%d + aes(color = I(color))
- 如果tiplab字體顏色要改變成各種分支的顏色丹允,那么在之前的p6代碼中,去掉color就可以了或者全部改成黑色袋倔。
#變成黑色字體
p6 <- ggtree(tree, layout = "circular", branch.length = "none")+geom_tiplab2(color = "black", size=3, hjust=-.05)+ xlim(NA, 20)
#變成相應(yīng)的彩色
p6 <- ggtree(tree, layout = "circular", branch.length = "none")+geom_tiplab2(size=3, hjust=-.05)+ xlim(NA, 20)
Summary
雖然Y叔確實(shí)寫了非常詳細(xì)的說明書雕蔽,但是對(duì)于新手來說,還是會(huì)有一定的入門難度宾娜。尤其是有些參數(shù)并沒有仔細(xì)說明用途批狐,點(diǎn)到為止。所以我自己也摸索了好久碳默,還不斷在ggtree group這個(gè)Y叔創(chuàng)建的問題論壇問問題,來一步步解決缘眶。Y叔還是解答的很及時(shí)的嘱根,經(jīng)常會(huì)馬上回答你。希望能夠幫助需要的人巷懈,同時(shí)我也能夠不斷地繼續(xù)摸索前行该抒,永無止境。
參考資料:
(1) https://yulab-smu.github.io/treedata-book/chapter4.html#introduction-1
(2) https://bioconductor.org/packages/release/bioc/manuals/ggtree/man/ggtree.pdf
(3) https://github.com/GuangchuangYu/ggtree/issues/52