在r中决定树状图(在树中将树状图背靠背放置)

Eli*_*eth 9 plot r hierarchical-clustering dendrogram ggplot2

是否有任何相当直接的方法在r中放置两个"背对背"的树状图?两个树形图包含相同的对象,但是以稍微不同的方式聚类.我需要强调树形图的不同之处.就像使用soilDB软件包所做的那样,但可能更少涉及土壤科学的定位?

在此输入图像描述

能够对树状图进行排列以最大化物体之间的直线数量(见上文)会很棒,因为这会强调树形图之间的任何差异.

有任何想法吗?

pla*_*pus 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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想不出一种方法来进行排列以优化直箭(我不熟悉绘制树形图),所以如果有人有想法,欢迎你评论,编辑或添加你的自己的答案.

我怀疑应该使用package ape,这是一个具有操作系统发育树的功能的包.