【问题标题】:How can I produce plots like this?我怎样才能产生这样的情节?
【发布时间】:2012-04-02 14:18:00
【问题描述】:

我遇到过这种对给定时间序列数据集执行层次聚类的图。谁能告诉我如何绘制这样的图?

我对 R 或 Javascript 的实现持开放态度,尤其是使用 d3.js

【问题讨论】:

    标签: javascript r ggplot2 d3.js dendrogram


    【解决方案1】:

    您始终可以手动创建情节: 使用基本图形,您可以使用 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 可能更容易...)

    【讨论】:

    • +1 非常感谢您!真是一个漂亮的方法:)
    • 这太棒了!您是否愿意对代码进行一些注释以帮助其他人学习并更轻松地查看代码中发生的情况?
    • 我可以支持@Frank。一些注释会很好!
    • 困难的部分是理解树是如何在hclust 对象中编码的:即在手册中(?hclust,在值部分),这对我来说也很神秘。最近的dendextend 包可能会简化这一点。为了排列图中的图,我使用par()$usr(在?par 中解释)返回当前图的尺寸,并使用par(new=TRUE,fig=) 为当前图添加新图。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2020-12-07
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多