2012-09-17 62 views
8

是否有任何相當直接的方式將兩個樹狀圖'背對背'放入r?兩個樹形圖包含相同的對象,但以稍微不同的方式聚集。我需要強調樹狀圖的不同。那麼像soilDB套件已經做了什麼,但可能涉及較少涉及土壤科學?r中的決鬥樹狀圖(將r狀態的樹狀圖背靠背地排列)

enter image description here

這將是偉大的,是能就能行樹形圖,最大限度的直線物體(見上文),因爲這之間去將強調樹狀圖之間的差異數量。

任何想法?

回答

10

有可能是一個更簡單的方法,但我沒有看到它所以這裏是從頭開始:

# 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)) 

enter image description here

我不能想辦法做排列組合,以優化直線箭頭(我不熟悉繪製樹狀圖),所以如果有人有一個想法,歡迎您發表評論,編輯或添加您自己的答案。

我懷疑你應該使用包ape,這是一個包含功能操縱系統發育樹的軟件包。

2

你在找什麼叫做Tanglegram plot這是用來在視覺上比較樹形圖。

實施tanglegram可在包dendextendR中獲得。事實上,它已經基於上述代碼開發了plannapus幾個相關的函數也可用於獲取最小糾纏的地塊,如untangle_step_rotate_2side