Reproduzindo o gráfico de dendrograma de treliça com ggplot2

É possível reproduzir este gráfico de rede com 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)))) 

insira a descrição da imagem aqui

EDITAR

A partir de 8 de agosto de 2011, o pacote ggdendro está disponível no CRAN. Note também que a function de extração de dendrogramas agora é chamada de dendro_data vez de cluster_data


Sim. Mas, por enquanto, você terá que passar por alguns obstáculos:

  1. Instale o pacote ggdendro (disponível no CRAN). Este pacote extrairá as informações do cluster de vários tipos de methods de cluster (incluindo Hclust e dendrogram ) com o propósito expresso de plotar em ggplot .
  2. Use charts de grade para criar viewports e alinhar três charts diferentes.

insira a descrição da imagem aqui

O código:

Primeiro carregue as bibliotecas e configure os dados para o 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") 

Extraia os dados do dendrograma e crie os charts

 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 charts de grade e algum alinhamento manual para posicionar os três charts na página

 ### 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)) 

Como Ben diz, tudo é possível. Algum trabalho para apoiar dendrogramas foi feito. Andrie de Vries fez um método fortificado de objects de tree. No entanto, o gráfico resultante não é bonito como você pode ver.

O azulejo seria fácil de fazer. Para o dendrograma eu inspecionaria o plot.dendrogram (usando getAnywhere ) para ver como as coordenadas dos segmentos são calculadas. Extraia essas coordenadas e use geom_segment para traçar o dendrograma. Em seguida, use viewports para plotar as peças e o dendrograma juntos. Desculpe eu não posso dar um exemplo, é muito trabalho e é tarde demais.

Eu espero que isso ajude

Felicidades

dendrograma

Duvidoso. Eu não vejo nenhuma function no Index para ggplot2 que sugira suporte para dendrogramas, e quando este blogueiro montou um conjunto de traduções das ilustrações no livro Lattice de Sarkar, ele foi incapaz de obter uma lenda do dendrograma ggplot:

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

Esses links fornecem uma solução para heatmaps com dendrogramas no ggplot2:

https://gist.github.com/chr1swallace/4672065

https://github.com/chr1swallace/random-functions/blob/master/R/ggplot-heatmap.R

e também este aqui:

Alinhar charts ggplot2 verticalmente