2012-09-17 14 views
8

r'de iki dendrogram 'arkaya' yerleştirmek için herhangi bir ileriye doğru yol var mı? İki dendrogram aynı nesneyi içerir, ancak biraz farklı şekillerde kümelenir. Dendrogramların nasıl farklı olduğunu vurgulamalıyım. Yani, soilDB paketiyle yapılan, ancak belki daha az uğraşan ve toprak bilimi ile olana benzer bir şey?Dueling dendrograms in r (dendrogramları r'ye geri yerleştirme)

enter image description here

dendrogramlar arasında herhangi farklılıkları vurgulamak istiyorum bu gibi nesnelerin (yukarıya bakınız) arasındaki gidiş düz çizgiler sayısını arttırmak için dendrogramlar hattına edebilmek edebilmek için çok iyi olurdu.

Herhangi bir fikrin var mı?

cevap

10

daha basit bir yolu olabilir ama işte o sıfırdan olduğunu görmüyorum:

# 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

ben optimize etmek permütasyon yapmak için bir yol düşünemiyorum düz oklar olsa da (başlangıçta dendrogramlar çizmeye pek aşina değilim), böylece herhangi bir fikriniz varsa yorum yazabilir, düzenleyebilir veya kendi cevabınızı ekleyebilirsin.

Birinin, filogenetik ağaçları işlemek için işlevleri olan bir paket olan ape paketini kullanması gerektiğinden şüpheleniyorum.

2

Aradığınızı, dendrogramları görsel olarak karşılaştırmak için kullanılan Tanglegram grafiği olarak adlandırıyoruz.

tanglegram numaralı uygulamadanumaralı telefondan R numaralı telefondan ulaşabilirsiniz. Aslında, yukarıdaki kod plannapus tarafından geliştirilmiştir. untangle_step_rotate_2side gibi asgari dolaşıklıklar ile parsellerin elde edilmesi için ilgili birçok fonksiyon da mevcuttur.