2012-03-17 12 views
29

मैं इस तरह की एक साजिश में आया हूं जो टाइम्सरी डेटा के दिए गए सेट पर पदानुक्रमित क्लस्टरिंग करता है। क्या कोई मुझे बता सकता है कि इस तरह के भूखंड कैसे आकर्षित करें?मैं इस तरह के भूखंड कैसे बना सकता हूं?

मैं R या जावास्क्रिप्ट में कार्यान्वयन के लिए खुला हूं, खासकर 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

+0

यह कमाल है! किसी भी मौके पर आप कोड को एनोटेट करने के इच्छुक हैं ताकि दूसरों को सीखने में मदद मिल सके और कोड में क्या हो रहा है, आसानी से देख सकें? – Jota

+1

मैं दूसरा @ फ्रैंक कर सकता हूं। कुछ एनोटेशन अच्छा होगा! – by0

संबंधित मुद्दे