用ggplot2重现晶格树状图

时间:2011-07-13 01:32:48

标签: r graphics ggplot2 lattice ggdendro

这可以用ggplot2重现这个格子图吗?

library(latticeExtra)
data(mtcars)
x  <- t(as.matrix(scale(mtcars)))
dd.row <- as.dendrogram(hclust(dist(x)))
row.ord <- order.dendrogram(dd.row)

dd.col <- as.dendrogram(hclust(dist(t(x))))
col.ord <- order.dendrogram(dd.col)

library(lattice)

levelplot(x[row.ord, col.ord],
      aspect = "fill",
      scales = list(x = list(rot = 90)),
      colorkey = list(space = "left"),
      legend =
      list(right =
           list(fun = dendrogramGrob,
                args =
                list(x = dd.col, ord = col.ord,
                     side = "right",
                     size = 10)),
           top =
           list(fun = dendrogramGrob,
                args =
                list(x = dd.row,
                     side = "top",
                     size = 10))))

enter image description here

4 个答案:

答案 0 :(得分:51)

修改

从2011年8月8日起,CRAN上提供了ggdendro个套餐 另请注意,树形图提取功能现在称为dendro_data而不是cluster_data


是的,确实如此。但是暂时你必须跳过几个环节:

  1. 安装ggdendro包(可从CRAN获得)。此包将从几种类型的聚类方法(包括Hclustdendrogram)中提取聚类信息,其明确目的是在ggplot中绘图。
  2. 使用网格图形创建视口并对齐三个不同的图。
  3. enter image description here

    代码:

    首先加载库并设置ggplot的数据:

    library(ggplot2)
    library(reshape2)
    library(ggdendro)
    
    data(mtcars)
    x <- as.matrix(scale(mtcars))
    dd.col <- as.dendrogram(hclust(dist(x)))
    col.ord <- order.dendrogram(dd.col)
    
    dd.row <- as.dendrogram(hclust(dist(t(x))))
    row.ord <- order.dendrogram(dd.row)
    
    xx <- scale(mtcars)[col.ord, row.ord]
    xx_names <- attr(xx, "dimnames")
    df <- as.data.frame(xx)
    colnames(df) <- xx_names[[2]]
    df$car <- xx_names[[1]]
    df$car <- with(df, factor(car, levels=car, ordered=TRUE))
    
    mdf <- melt(df, id.vars="car")
    

    提取树状图数据并创建图

    ddata_x <- dendro_data(dd.row)
    ddata_y <- dendro_data(dd.col)
    
    ### Set up a blank theme
    theme_none <- theme(
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank(),
      panel.background = element_blank(),
      axis.title.x = element_text(colour=NA),
      axis.title.y = element_blank(),
      axis.text.x = element_blank(),
      axis.text.y = element_blank(),
      axis.line = element_blank()
      #axis.ticks.length = element_blank()
    )
    
    ### Create plot components ###    
    # Heatmap
    p1 <- ggplot(mdf, aes(x=variable, y=car)) + 
      geom_tile(aes(fill=value)) + scale_fill_gradient2()
    
    # Dendrogram 1
    p2 <- ggplot(segment(ddata_x)) + 
      geom_segment(aes(x=x, y=y, xend=xend, yend=yend)) + 
      theme_none + theme(axis.title.x=element_blank())
    
    # Dendrogram 2
    p3 <- ggplot(segment(ddata_y)) + 
      geom_segment(aes(x=x, y=y, xend=xend, yend=yend)) + 
      coord_flip() + theme_none
    

    使用网格图形和一些手动对齐来定位页面上的三个图

    ### Draw graphic ###
    
    grid.newpage()
    print(p1, vp=viewport(0.8, 0.8, x=0.4, y=0.4))
    print(p2, vp=viewport(0.52, 0.2, x=0.45, y=0.9))
    print(p3, vp=viewport(0.2, 0.8, x=0.9, y=0.4))
    

答案 1 :(得分:6)

正如Ben所说,一切皆有可能。已经完成了一些支持树状图的工作。 Andrie de Vries制作了fortify树对象方法。但是,您看到的结果图形并不漂亮。

瓷砖很容易做到。对于树形图,我会检查plot.dendrogram(使用getAnywhere)以查看如何计算线段的坐标。提取这些坐标并使用geom_segment绘制树形图。然后使用视口将图块和树状图一起绘制。对不起,我不能举一个例子,这是很多工作而且为时已晚。

我希望这会有所帮助

干杯

dendrogram

答案 2 :(得分:4)

疑。我没有在ggplot2的索引中看到任何建议支持树形图的功能,当这个博主在Sarkar的莱迪思书中整理了一组插图的翻译时,他无法获得ggplot树形图传奇:

http://learnr.wordpress.com/2009/08/10/ggplot2-version-of-figures-in-lattice-multivariate-data-visualization-with-r-part-9/

答案 3 :(得分:1)