用ggplot2重现晶格树状图

MYa*_*208 35 graphics r 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))))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

And*_*rie 51

编辑

从2011年8月8日ggdendro开始,CRAN上提供了包装 注意,现在调用树形图提取功能dendro_data而不是cluster_data


是的.但是暂时你将不得不跳过几个圈:

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

在此输入图像描述

代码:

首先加载库并设置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")
Run Code Online (Sandbox Code Playgroud)

提取树状图数据并创建图

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
Run Code Online (Sandbox Code Playgroud)

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

### 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))
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了!希望有这个功能!我想知道是否有办法让树形图尺寸与瓷砖图尺寸相匹配?手动调整视口大小和位置是繁琐的,并且不能很好地工作,但应该可以从图中的信息中进行操作:(http://stackoverflow.com/questions/13867325/get-width-of-plot -area-in-ggplot2?rq = 1和http://stackoverflow.com/questions/13294952/left-align-two-graph-edges-ggplot?lq=1) (2认同)
  • 感谢您的更正。还需要加载 gridExtra 包。此外,我沿 x 轴的树状图没有正确对齐。还有其他人得到这样的东西吗? (2认同)

Luc*_*zer 6

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

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

我希望这有帮助

干杯

树状图

  • +1用于挖掘我很久以前写过的代码.不像你说的那样漂亮...... (2认同)