2012-03-17 12 views
29

Natknąłem się na ten rodzaj wykresu, który wykonuje hierarchiczne grupowanie w danym zbiorze danych z czasów. Czy ktoś może mi powiedzieć, jak narysować takie wątki?Jak mogę generować takie wątki?

Jestem otwarty na wdrożenia w R lub Javascript, szczególnie przy użyciu d3.js.

enter image description here

Odpowiedz

44

Zawsze można stworzyć fabułę ręcznie: z grafiką bazowych, to parametr fig pozwala na dodanie działek wewnątrz innej działki.

# 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

(po napisaniu tego, zdaję sobie sprawę, że jest to prawdopodobnie łatwiej zrobić z layout ...)

+1

+1 Dziękuję bardzo za to! Naprawdę piękne podejście :) – Legend

+0

To jest niesamowite! Czy jest szansa, że ​​napiszesz adnotację kodu, aby pomóc innym uczyć się i łatwiej zobaczyć, co dzieje się w kodzie? – Jota

+1

Mogę sekundować @Frank. Adnotacja byłaby miła! – by0

Powiązane problemy