我試圖在使用包'ape'繪製樹時,在相同'樣式'中繪製凝聚聚類(UPGMA與Agnes) 。一個簡單的例子,我在下圖中包括 改變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()
這顯然是不理想,「對齊」情節不是我想要的。我認爲這與分支長度計算有關,但我不知道如何解決這個問題。當然,與colLab函數的結果相比,看起來更像是我想要報告的樹狀圖風格。另外,在代碼使用上述use.edge.length=T
確實給未「對齊」的正常聚類:
使用里斯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)
這張圖越來越接近我想要的東西,但是我不知道爲什麼空心圓出現在葉上以及如何去除它們。
任何幫助,非常感謝。
親切的問候,
FM
Joris,謝謝你的迴應。在我的機器上,這也解決了這個問題。關於你對'use.edge.length'的評論,我已經編輯了我原來的帖子,表明我使用它得到了不良結果。我不得不承認,我對細節仍然有點模糊。例如,如果我將'lab.cex'添加到節點的屬性(例如''attr(n,「nodePar」)< - c($ nodePar,lab.col = labCol,pch = NA,lab.cex = 0.6)'。我收到一條錯誤消息,我不明白:'dLeaf * lab.cex中的錯誤:二進制運算符的非數字參數。 –
查看我的編輯.... –