2013-04-17 190 views
4

我試圖在使用包'ape'繪製樹時,在相同'樣式'中繪製凝聚聚類(UPGMA與Agnes) 。一個簡單的例子,我在下圖中包括 Figure 1. A simple example of the final output required改變plot.dendrogram中的葉顏色,類似於package ape的plot.phylo

關鍵問題是,我希望能夠基於樹葉標籤中的模式對樹狀圖的樹葉着色。我嘗試了兩種方法:或者使用hc2Newick,或者我使用Joris Meys的代碼,如Change Dendrogram leaves的答案中所提出的。兩者都沒有給出令人滿意的結果。這可能是因爲我不完全理解樹狀圖的構建方式。可以在https://www.dropbox.com/s/gke9qnvwptltkky/abundance.agnes.ave上找到abundance.agnes.ave對象(從運行agnes存儲)的ASCII保存。

當我使用第一個選項(與hc2Newick從Bioconductor的的ctc包)我使用此代碼時,你得到如下圖所示:

write(hc2Newick(as.hclust(abundance.agnes.ave)),file="all_samples_euclidean.tre") 
eucltree<-read.tree(file="all_samples_euclidean.tre") 
eucltree.laz<-ladderize(eucltree,FALSE) 
tiplabs<-eucltree$tip.label 
numbertiplabs<-length(tiplabs) 
colourtips<-rep("green",numbertiplabs) 
colourtips[grep("II",tiplabs)]<-"red" 
plot(eucltree.laz,tip.color=colourtips,adj=1,cex=0.6,use.edge.length=F) 
add.scale.bar() 

Using plot.phylo

這顯然是不理想,「對齊」情節不是我想要的。我認爲這與分支長度計算有關,但我不知道如何解決這個問題。當然,與colLab函數的結果相比,看起來更像是我想要報告的樹狀圖風格。另外,在代碼使用上述use.edge.length=T確實給未「對齊」的正常聚類: Plot.phylo with branch length

使用里斯Meys'個協作功能用下面的代碼的第二方法使下圖

clusDendro<-as.dendrogram(as.hclust(abundance.agnes.ave)) 
labelColors<-c("red","green") 
clusMember<-rep(1,length(rownames(abundance.x))) 
clusMember[grep("II",rownames(abundance.x))]<-2 
names(clusMember)<-rownames(abundance.x) 

colLab <- function(n) 
{ 
    if(is.leaf(n)) { 
    a <- attributes(n) 
    # clusMember - a vector designating leaf grouping 
    # labelColors - a vector of colors for the above grouping 
    labCol <- labelColors[clusMember[which(names(clusMember) == a$label)]] 
    attr(n, "nodePar") <- c(a$nodePar, lab.col = labCol) 
    } 
    n 
} 

clusDendro<-dendrapply(clusDendro, colLab) 
plot(clusDendro,horiz=T,axes=F) 

Using colLab 這張圖越來越接近我想要的東西,但是我不知道爲什麼空心圓出現在葉上以及如何去除它們。

任何幫助,非常感謝。

親切的問候,

FM

回答

0

我寫的代碼前一段,而且似乎有什麼東西在機制上變化不大。

我使用的plot.dendrogram函數有一個參數nodePar。自上次使用該函數後,行爲發生了變化,雖然通常用於內部節點,但它顯然也會影響外部節點。根據幫助文件,現在pch的默認值是1:2

因此,您需要在添加到colLab函數外層節點的屬性中專門指定pch=NA。嘗試像這樣調整它:

colLab <- function(n) 
{ 
    if(is.leaf(n)) { 
    a <- attributes(n) 
    # clusMember - a vector designating leaf grouping 
    # labelColors - a vector of colors for the above grouping 
    labCol <- labelColors[clusMember[which(names(clusMember) == a$label)]] 

    attr(n, "nodePar") <- 
     if(is.list(a$nodePar)) c(a$nodePar, lab.col = labCol,pch=NA) else 
           list(lab.col = labCol,pch=NA) 
    } 
    n 
} 

在我的機器上,解決了問題。

或者,您可以查看ape軟件包中函數plot.phylo的參數use.edge.length。您將其設置爲FALSE,但根據您的解釋,我相信您希望將其設置爲默認值TRUE

編輯:爲了使功能更通用,可能是一個好主意,將labelColorsclusMember作爲參數添加到該函數。我的快速 - 骯髒的解決方案不是乾淨的代碼的最好的例子...

也忘記我說的使用邊緣長度。猿包將其解釋爲真正的樹狀圖,並且將use.edge.lengthTRUE將邊緣長度轉換爲進化時間。因此樹狀圖的'怪異'概述。

還要注意,以防treeleafs沒有nodePar屬性,添加使用c()功能會導致意想不到的效果額外的參數:如果添加例如lab.cex=0.6,該c()函數將創建,而不是列表的向量,並在參數列表中存在字符值時將lab.cex的值轉換爲字符。在這種情況下,這將是該顏色的名稱,並解釋了您在評論中討論的錯誤。

+1

Joris,謝謝你的迴應。在我的機器上,這也解決了這個問題。關於你對'use.edge.length'的評論,我已經編輯了我原來的帖子,表明我使用它得到了不良結果。我不得不承認,我對細節仍然有點模糊。例如,如果我將'lab.cex'添加到節點的屬性(例如''attr(n,「nodePar」)< - c($ nodePar,lab.col = labCol,pch = NA,lab.cex = 0.6)'。我收到一條錯誤消息,我不明白:'dLeaf * lab.cex中的錯誤:二進制運算符的非數字參數。 –

+1

查看我的編輯.... –

2

此功能現在可以在名爲「dendextend」的新軟件包中使用,該軟件包專門爲此類功能而打造。

你可以看到在包的介紹和護身符許多例子中,「用法」一節中在以下網址:https://github.com/talgalili/dendextend

一個幾乎精確的問題只是回答下面的SO問題:

https://stackoverflow.com/a/18832457/256662

+1

感謝您的更新,我會盡快調查您的軟件包的使用情況。其實我只是在尋找一種可能性,讓你的小插圖中顯示'tanglegrams'! –

+1

我很高興FM。此外,如果您將使用該軟件包創建某些內容 - 請考慮通過電子郵件向我發送有關您的工作的信息(我的聯繫人位於github主頁上)。我非常希望展示使用此代碼的真實案例研究的例子,所以我很樂意推廣您的工作。 祝你好運, Tal Galili –