2012-03-17 29 views
29

Tôi đã bắt gặp loại âm mưu này thực hiện phân cụm theo cấp bậc trên một tập hợp dữ liệu thời gian nhất định. Ai đó có thể cho tôi biết làm thế nào để vẽ các ô đó?Làm thế nào tôi có thể sản xuất các ô như thế này?

Tôi mở để triển khai trong R hoặc Javascript, đặc biệt là sử dụng d3.js.

enter image description here

Trả lời

44

Bạn luôn có thể tạo ra các âm mưu bằng tay: với đồ họa cơ bản, bạn fig tham số cho phép bạn thêm âm mưu bên trong âm mưu khác.

# 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

(Sau khi viết những dòng này, tôi nhận ra rằng nó có lẽ là dễ dàng hơn để làm với layout ...)

+1

1 Cảm ơn bạn rất nhiều cho việc này! Thực sự là một cách tiếp cận đẹp :) – Legend

+0

Điều này thật tuyệt vời! Bất kỳ cơ hội nào bạn sẵn sàng chú thích mã một chút để giúp người khác tìm hiểu và dễ dàng thấy được những gì đang xảy ra trong mã? – Jota

+1

Tôi có thể thứ hai @Frank. Một số chú thích sẽ tốt đẹp! – by0

Các vấn đề liên quan