2012-03-17 16 views
29

Me he topado con este tipo de diagrama que realiza una agrupación jerárquica sobre un conjunto determinado de datos de series temporales. ¿Puede alguien decirme cómo dibujar tales tramas?¿Cómo puedo producir tramas como esta?

Estoy abierto a implementaciones en R o Javascript, especialmente usando d3.js.

enter image description here

Respuesta

44

Siempre se puede crear la trama con la mano: con los gráficos de base, que el parámetro fig le permite añadir parcelas dentro de otra trama.

# Sample data 
n <- 100 
k <- 6 
d <- matrix(rnorm(k*n),nc=k) 
d[,2] <- d[,1] # To help check the results 
colnames(d) <- LETTERS[1:k] 
x <- apply(d,2,cumsum) 
r <- hclust(dist(t(d))) 
# Plot 
op <- par(mar=c(0,0,0,0),oma=c(0,2,0,0)) 
plot(NA,ylim=c(.5,k+.5), xlim=c(0,4),axes=FALSE) 
# Dendrogram. See ?hclust for details. 
xc <- yc <- rep(NA,k) 
o <- 1:k 
o[r$order] <- 1:k 
for(i in 1:(k-1)) { 
    a <- r$merge[i,1] 
    x1 <- if(a<0) o[-a] else xc[a] 
    y1 <- if(a<0) 0 else yc[a] 
    b <- r$merge[i,2] 
    x2 <- if(b<0) o[-b] else xc[b] 
    y2 <- if(b<0) 0 else yc[b] 
    lines( 
    3+c(y1,i,i,y2)/k, 
    c(x1,x1,x2,x2), 
    lwd=k-i 
) 
    xc[i] <- (x1+x2)/2 
    yc[i] <- i 
} 
# Time series 
axis(2,1:k,colnames(d)[r$order],las=1) 
u <- par()$usr 
for(i in 1:k) { 
    f <- c(0,3,i-.5,i+.5) 
    f <- c( 
    (f[1]-u[1])/(u[2]-u[1]), 
    (f[2]-u[1])/(u[2]-u[1]), 
    (f[3]-u[3])/(u[4]-u[3]), 
    (f[4]-u[3])/(u[4]-u[3]) 
) 
    par(new=TRUE,fig=f) 
    plot(x[,r$order[i]],axes=FALSE,xlab="",ylab="",main="",type="l",col="navy",lwd=2) 
    box() 
} 
par(op) 

Dendogram with time series

(Después de escribir esto, me doy cuenta de que es probable que sea más fácil de ver con layout ...)

+1

1 muchas gracias por esto! Realmente un enfoque hermoso :) – Legend

+0

¡Esto es asombroso! ¿Hay alguna posibilidad de que esté dispuesto a anotar un poco el código para ayudar a otros a aprender y ver más fácilmente lo que está sucediendo en el código? – Jota

+1

Puedo segundo @Frank. ¡Alguna anotación sería agradable! – by0

Cuestiones relacionadas