簡體   English   中英

像包裝猿的plot.phylo一樣更改plot.dendrogram中的葉子顏色

[英]Change leaf color in plot.dendrogram like with plot.phylo of package ape

我正在嘗試以與使用包“猿”繪制樹時相同的“樣式”來繪制聚集聚類的結果(UPGMA與Agnes)。 我在下圖中包含一個簡單的示例 圖1.所需最終輸出的簡單示例

關鍵問題是我希望能夠根據葉子標簽中的圖案為樹狀圖的葉子着色。 我嘗試了兩種方法:要么我使用了hc2Newick要么我使用了Joris Meys的代碼,該代碼是對Change Dendrogram leaves的回答中提出的。 兩者均未提供令人滿意的輸出。 我可能也不完全了解樹狀圖的構造方式。 您可以在https://www.dropbox.com/s/gke9qnvwptltkky/abundance.agnes.ave上找到abundance.agnes.ave對象(通過運行agnes存儲)的ASCII保存。

當我使用第一個選項(與hc2Newickctc軟件包中的hc2Newick一起使用)時,使用此代碼時,我得到下圖:

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()

使用plot.phylo

這顯然是不理想的,情節的“對齊”不是我想要的。 我認為這與分支長度的計算有關,但是我不知道如何解決此問題。 當然,與colLab函數的結果相比,它看起來更像我要報告的樹狀圖樣式。 另外,在上面的代碼中使用use.edge.length=T確實會產生未正確“對齊”的聚類: 具有分支長度的Plot.phylo

使用Joris Meys的colLab函數和以下代碼的第二種方法給出下圖

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)

使用colLab 該圖越來越接近我想要的圖,但是我不知道為什么空心圓出現在葉子上以及如何將其刪除。

任何幫助深表感謝。

親切的問候,

調頻

現在,此功能可在名為“ dendextend ”的新軟件包中使用,該軟件包正是針對此類情況而構建的。

在以下URL的“用法”部分中,您可以在該包的演示文稿和小插圖中看到許多示例: https : //github.com/talgalili/dendextend

下列SO問題僅回答了一個幾乎准確的問題:

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

我在很早以前就編寫了該代碼,但似乎該機制有些變化。

我使用的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添加labelColors函數的參數。 我的快速處理方法不是干凈代碼的最佳示例。

也忘了我所說的使用邊長的話。 ape程序包將其解釋為真實的樹狀圖,並將use.edge.lengthTRUE會將邊長轉換為進化時間。 因此,樹狀圖的“怪異”概述。

還要注意,如果樹形葉沒有nodePar屬性,則使用c()函數添加額外的參數會導致不希望的效果:如果添加例如lab.cex=0.6 ,則c()函數將創建一個矢量列表,然后在參數列表中存在字符值時,將lab.cex的值轉換為字符。 在這種情況下,它將成為顏色的名稱,並解釋了您在注釋中談論的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM