R 用ggplot2再现格点树状图

R 用ggplot2再现格点树状图,r,graphics,ggplot2,lattice,ggdendro,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.dendrog

这是否可以用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))))
库(latticeExtra)
数据(mtcars)

x可疑。我看不到ggplot2索引中有任何函数建议支持树状图,当这位博主将Sarkar的Lattice book中插图的一组翻译放在一起时,他无法获得ggplot树状图图例:


正如本所说,一切皆有可能。一些支持树状图的工作已经完成。安德烈·德弗里斯(Andrie de Vries)提出了一种树对象的方法。但是,生成的图形并不像您所看到的那样漂亮

瓷砖很容易做。对于树状图,我将检查
plot.dendrogram
(使用
getAnywhere
)以查看如何计算线段的坐标。提取这些坐标并使用geom_段绘制树状图。然后使用视口将平铺和树状图一起打印。对不起,我不能举个例子,这是一个很大的工作,而且已经太晚了

我希望这有帮助

干杯

编辑

从2011年8月8日起,
ggdendro
套餐在 还要注意,树状图提取功能现在被称为
dendro_data
,而不是
cluster_data


是的。但就目前而言,你将不得不跳过一些障碍:

  • 安装
    ggdendro
    软件包(可从CRAN获得)。该软件包将从几种类型的聚类方法(包括
    Hclust
    dendrogram
    )中提取聚类信息,明确目的是在
    ggplot
    中进行绘图
  • 使用栅格图形创建视口并对齐三个不同的打印
  • 守则:

    首先加载库并设置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")
    

    这些链接提供了ggplot2中具有树状图的热图解决方案:

    还有这个:


    到目前为止你试过什么吗?我猜:可能(一切都有可能),不容易。有人在ggplot2中做了一些系统发育研究,可能还有其他绘制树状图的代码。您可能需要将这些部分与
    grid
    graphics组合在一起。。。实际上,由于您已经获得了树状图,您可以使用
    geom_tile
    制作中间部分,然后将这些部分与
    ggExtra
    gridExtra
    中的函数组合在一起,正如您所说的那样,@BenBolker,一切都是可能的。在这种情况下,它只是变得简单了一点。请看我的答案:我认为有些人已经拼凑出了一些解决方案,这些解决方案至少是一个很好的起点:请看,可能也有一些用处。@DWin从不说不。请参阅我的答案:+1,以了解我很久很久以前编写的代码。不漂亮,就像你说的…很好。最好(1)将图例移到某个地方,(2)扩展geom_tile(),使其填满整个面板(我认为这两个都是可行的,#2内部和#1带有
    ggExtra
    tricks…)@Andrie:这个R包何时可以安装?实际上我想使用这个软件包,但不知道下载后如何构建它。谢谢这太棒了!希望有一个功能为这个!我想知道是否有一种方法可以使密度图的大小与平铺图的大小相匹配?手动调整视口的大小和位置非常繁琐,效果也不理想,但应该可以从绘图中的信息进行调整:(和)@Lilith Elina感谢您确定了该修复方案。我已经更新了答案,以反映这一点,并符合当前发布的
    ggplot2
    ,即没有主题警告。感谢您的更正。还需要加载gridExtra包。此外,我沿x轴的树状图没有正确对齐。还有谁有这样的东西吗?
    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))