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