我正在尝试以与使用包“ape”绘制树时相同的“样式”绘制凝聚聚类(带有 Agnes 的 UPGMA)的结果。我在下图中包含了一个简单的示例
关键问题是我希望能够根据叶子标签中的 a 模式为树状图的叶子着色。我尝试了两种方法:要么我使用,要么hc2Newick
使用 Joris Meys 在Change Dendrogram Leaves 的答案中提出的代码。两者都没有给出令人满意的输出。可能是我也不完全理解树状图的构建方式。abundance.agnes.ave
可以在https://www.dropbox.com/s/gke9qnvwptltkky/abundance.agnes.ave上找到对象的 ASCII 保存(从运行 agnes 中存储) 。
当我使用第一个选项(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
在上面的代码中使用确实会给出一个未正确“对齐”的聚类:
使用 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)
这个情节越来越接近我想要的,但是我不知道为什么叶子上会出现空心圆圈以及如何去除它们。
任何帮助深表感谢。
亲切的问候,
调频