【发布时间】:2012-04-02 14:18:00
【问题描述】:
我遇到过这种对给定时间序列数据集执行层次聚类的图。谁能告诉我如何绘制这样的图?
我对 R 或 Javascript 的实现持开放态度,尤其是使用 d3.js。
【问题讨论】:
标签: javascript r ggplot2 d3.js dendrogram
我遇到过这种对给定时间序列数据集执行层次聚类的图。谁能告诉我如何绘制这样的图?
我对 R 或 Javascript 的实现持开放态度,尤其是使用 d3.js。
【问题讨论】:
标签: javascript r ggplot2 d3.js dendrogram
您始终可以手动创建情节:
使用基本图形,您可以使用 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)
(写完之后,我意识到使用layout 可能更容易...)
【讨论】:
hclust 对象中编码的:即在手册中(?hclust,在值部分),这对我来说也很神秘。最近的dendextend 包可能会简化这一点。为了排列图中的图,我使用par()$usr(在?par 中解释)返回当前图的尺寸,并使用par(new=TRUE,fig=) 为当前图添加新图。