35 votes

Reproduire un graphique de dendrogramme sur réseau avec ggplot2

Est-il possible de reproduire ce tracé de réseau avec 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))))
 

entrez la description de l'image ici Merci d'avance.

51voto

Andrie Points 66979

MODIFIER

À partir du 8 août 2011, le ggdendro est disponible sur le CRAN Notez également que le dendrogramme fonction d'extraction est maintenant appelé dendro_data au lieu de cluster_data


Oui, il est. Mais pour le moment, vous devez passer par quelques étapes:

  1. Installer l' ggdendro ensemble (disponible à partir de CRAN). Cela permettra d'extraire les informations de cluster à partir de plusieurs types de méthodes de clustering (y compris Hclust et dendrogram) dans le but exprès de complot en ggplot.
  2. Utiliser la grille graphique pour créer des fenêtres et d'aligner trois parcelles différentes.

enter image description here

Le code:

Tout d'abord charger les bibliothèques et configurer les données pour 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")

Extrait de dendrogramme de données et de créer des parcelles

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

Utiliser la grille graphique et certains d'alignement manuel de la position de la trois parcelles sur la 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))

6voto

Luciano Selzer Points 4351

Ben dit, tout est possible. Peu de travail pour soutenir dendrograms a été fait. Andrie de Vries a fait fortifier la méthode de l'arbre des objets. Cependant, le graphique n'est pas assez comme vous pouvez le voir.

La tuile serait facile à faire. Pour le dendrogramme je serait d'inspecter plot.dendrogram (à l'aide d' getAnywhere) pour voir comment les coordonnées pour les segments sont calculés. Extraire ces coordonnées et utiliser geom_segment pour tracer le dendrogramme. Utilisez ensuite les fenêtres de tracer les tuiles et le dendrogramme ensemble. Désolé je ne peux pas donner un exemple, c'est beaucoup de travail et il est trop tard.

J'espère que cette aide

Cheers

dendrogram

4voto

BondedDust Points 105234

Douteux. Je ne vois pas toutes les fonctions dans l'Indice de ggplot2 qui suggèrent un soutien pour dendrograms, et quand ce blogueur mis en place un ensemble de traductions des illustrations dans Sarkar du Treillis livre, il n'a pas pu obtenir un ggplot dendrogramme de la légende:

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

1voto

wannymahoots Points 285

Ces liens offrent une solution pour les cartes de chaleur avec dendrograms dans ggplot2:

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

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

et aussi celui-ci:

Aligner ggplot2 parcelles verticalement

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X