是否有任何相当直接的方式将两个树状图'背靠背'放入r?两个树形图包含相同的对象,但是以稍微不同的方式聚类。我需要强调树形图的不同之处。那么像soilDB包那样做了什么,但可能涉及的较少,土壤科学也是如此?
能够对树形图进行排列以最大化物体之间的直线数量(见上文)会很棒,因为这会强调树形图之间的任何差异。
有什么想法吗?
答案 0 :(得分:11)
可能有一种更简单的方法,但我没有看到它,所以这是从头开始:
# First two dummy clusters (since you didn't provide with some...)
hc1 <- hclust(dist(USArrests), "average")
hc2 <- hclust(dist(USArrests), "complete")
l <- length(hc1$order)
# The matrix to draw the arrows:
cbind((1:l)[order(hc1$order)],(1:l)[order(hc2$order)]) -> ord_arrow
# The two vectors of ordered leave labels:
hc1$labels[hc1$order]->leaves1
hc2$labels[hc2$order]->leaves2
# And the plot:
layout(matrix(1:5,nrow=1),width=c(5,2,3,2,5))
# The first dendrogram:
par(mar=c(3,3,3,0))
plot(as.dendrogram(hc1),horiz=TRUE,leaflab="none", ylim=c(0,l))
# The first serie of labels (i draw them separately because, for the second serie, I didn't find a simple way to draw them nicely on the cluster):
par(mar=c(3,0,3,0))
plot(NA, bty="n",axes=FALSE,xlim=c(0,1), ylim=c(0,l),ylab="",xlab="")
sapply(1:l,function(x)text(x=0,y=x,labels=leaves1[x], pos=4, cex=0.8))
# The arrows:
par(mar=c(3,0,3,0))
plot(NA, bty="n",axes=FALSE,xlim=c(0,1), ylim=c(0,l),ylab="",xlab="")
apply(ord_arrow,1,function(x){arrows(0,x[1],1,x[2],code=3, length=0.05, col="blue")})
# The second serie of labels:
par(mar=c(3,0,3,0))
plot(NA, bty="n",axes=FALSE, xlim=c(0,1), ylim=c(0,l), ylab="",xlab="")
sapply(1:l,function(x)text(x=1,y=x,labels=leaves2[x], pos=2, cex=0.8))
# And the second dendrogram (to reverse it I reversed the xlim vector:
par(mar=c(3,0,3,3))
plot(as.dendrogram(hc2),horiz=TRUE, xlim=c(0,max(dist(USArrests))), leaflab="none", ylim=c(0,l))
我想不出一种方法来进行排列以优化直箭头(我不熟悉绘制树形图),所以如果有人有想法,欢迎您发表评论,编辑或者添加你自己的答案。
我怀疑应该使用包ape
,这是一个包含操作系统发育树的函数的包。
答案 1 :(得分:3)
您正在寻找的是一种 Tanglegram图,用于在视觉上比较树形图。
tanglegram
中的dendextend
个包中提供了一个实施R
。实际上它是基于上面的代码plannapus开发的。几个相关的函数也可用于获取具有最小纠缠的图,例如untangle_step_rotate_2side
。