2012-03-17 7 views
29

Mi sono imbattuto in questo tipo di grafico che esegue il clustering gerarchico su un determinato insieme di dati di timeseries. Qualcuno può dirmi come disegnare queste trame?Come posso produrre grafici come questo?

Sono aperto alle implementazioni in R o Javascript, in particolare utilizzando d3.js.

enter image description here

risposta

44

È sempre possibile creare la trama a mano: con la grafica di base, è il parametro fig consente di aggiungere trame all'interno di un altro complotto.

# 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

(Dopo aver scritto questo, mi rendo conto che probabilmente è più facile da fare con layout ...)

+1

+1 Grazie tanto per questo! Davvero un bellissimo approccio :) – Legend

+0

Questo è fantastico! Qualche possibilità che tu voglia annotare il codice un po 'per aiutare gli altri a imparare e vedere più facilmente cosa sta succedendo nel codice? – Jota

+1

Posso secondo @Frank. Qualche annotazione sarebbe carina! – by0

Problemi correlati