2012-03-17 28 views
29

我遇到過這種在給定的時間序列數據集上執行層次聚類的情節。有人能告訴我如何繪製這樣的地塊嗎?我該如何製作這樣的情節?

我願意在R或Javascript中實現,特別是使用d3.js

enter image description here

回答

44

您可以隨時手動創建情節: 與基地的圖形,你fig參數 允許您添加另一個情節裏地塊。

# 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

(寫在這之後,我意識到,這可能是與layout容易做......)

+1

+1非常感謝你爲這個!真的很漂亮:) – Legend 2012-03-17 21:11:25

+0

這真棒!您有可能會稍微註釋一下代碼以幫助其他人學習,並更輕鬆地看到代碼中發生了什麼? – Jota 2014-07-08 19:11:10

+1

我可以秒@Frank。一些註釋會很好! – by0 2014-08-09 22:41:56