Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reproducing lattice dendrogram graph with ggplot2

Is this possible to reproduce this lattice plot with 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

like image 758
MYaseen208 Avatar asked Jul 13 '11 01:07

MYaseen208


1 Answers

EDIT

From 8 August 2011 the ggdendro package is available on CRAN Note also that the dendrogram extraction function is now called dendro_data instead of cluster_data


Yes, it is. But for the time being you will have to jump through a few hoops:

  1. Install the ggdendro package (available from CRAN). This package will extract the cluster information from several types of cluster methods (including Hclust and dendrogram) with the express purpose of plotting in ggplot.
  2. Use grid graphics to create viewports and align three different plots.

enter image description here

The code:

First load the libraries and set up the data for 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") 

Extract dendrogram data and create the plots

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 

Use grid graphics and some manual alignment to position the three plots on the page

### 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)) 
like image 121
Andrie Avatar answered Oct 11 '22 10:10

Andrie