![](/img/trans.png)
[英]color.plot.phylo in PICANTE, how do you change size (cex) of tips or pass commands to plot.phylo?
[英]Change leaf color in plot.dendrogram like with plot.phylo of package ape
我正在嘗試以與使用包“猿”繪制樹時相同的“樣式”來繪制聚集聚類的結果(UPGMA與Agnes)。 我在下圖中包含一個簡單的示例
關鍵問題是我希望能夠根據葉子標簽中的圖案為樹狀圖的葉子着色。 我嘗試了兩種方法:要么我使用了hc2Newick
要么我使用了Joris Meys的代碼,該代碼是對Change Dendrogram leaves的回答中提出的。 兩者均未提供令人滿意的輸出。 我可能也不完全了解樹狀圖的構造方式。 您可以在https://www.dropbox.com/s/gke9qnvwptltkky/abundance.agnes.ave上找到abundance.agnes.ave
對象(通過運行agnes存儲)的ASCII保存。
當我使用第一個選項(與hc2Newick
的ctc
軟件包中的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()
這顯然是不理想的,情節的“對齊”不是我想要的。 我認為這與分支長度的計算有關,但是我不知道如何解決此問題。 當然,與colLab函數的結果相比,它看起來更像我要報告的樹狀圖樣式。 另外,在上面的代碼中使用use.edge.length=T
確實會產生未正確“對齊”的聚類:
使用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)
該圖越來越接近我想要的圖,但是我不知道為什么空心圓出現在葉子上以及如何將其刪除。
任何幫助深表感謝。
親切的問候,
調頻
現在,此功能可在名為“ dendextend ”的新軟件包中使用,該軟件包正是針對此類情況而構建的。
在以下URL的“用法”部分中,您可以在該包的演示文稿和小插圖中看到許多示例: https : //github.com/talgalili/dendextend
下列SO問題僅回答了一個幾乎准確的問題:
我在很早以前就編寫了該代碼,但似乎該機制有些變化。
我使用的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
。
編輯:為了使該函數更通用,最好將labelColors
和clusMember
添加labelColors
函數的參數。 我的快速處理方法不是干凈代碼的最佳示例。
也忘了我所說的使用邊長的話。 ape程序包將其解釋為真實的樹狀圖,並將use.edge.length
為TRUE
會將邊長轉換為進化時間。 因此,樹狀圖的“怪異”概述。
還要注意,如果樹形葉沒有nodePar
屬性,則使用c()
函數添加額外的參數會導致不希望的效果:如果添加例如lab.cex=0.6
,則c()
函數將創建一個矢量列表,然后在參數列表中存在字符值時,將lab.cex
的值轉換為字符。 在這種情況下,它將成為顏色的名稱,並解釋了您在注釋中談論的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.