Reproduction d'un graphique dendrogramme en réseau avec ggplot2

est-ce possible de reproduire ce tracé en treillis 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))))

enter image description here

35
demandé sur hello_there_andy 2011-07-13 05:32:47

4 réponses

MODIFIER

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


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

  1. installez le paquet ggdendro (disponible de CRAN). Ce paquet extraira l'information de faisceau de plusieurs types de méthodes de faisceau (y compris Hclust et dendrogram ) avec le but exprès de tracer dans ggplot .
  2. utilisez des graphiques de grille pour créer des viewports et aligner trois tracés différents.

enter image description here

le code:

charger D'abord 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")

extraire des données dendrogramme et créer les 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 des graphiques de grille et un certain alignement manuel pour positionner les trois tracés 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))
50
répondu Andrie 2014-01-13 20:21:13

comme dit Ben, tout est possible. Certains travaux visant à soutenir les dendrogrammes ont été réalisés. Andrie de Vries a fait une fortifier méthode des objets d'arbre. Cependant, le graphique n'est pas assez comme vous pouvez le voir.

La tuile serait facile à faire. Pour le dendrogramme, j'inspecterais plot.dendrogram (en utilisant getAnywhere ) pour voir comment les coordonnées des segments sont calculées. Extraire ces coordonnées et utiliser geom_segment pour tracer la 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

6
répondu Luciano Selzer 2011-07-13 02:51:23

douteux. Je ne vois aucune fonction dans L'Index de ggplot2 qui suggérerait un support pour les dendrogrammes, et quand ce blogueur a mis en place un ensemble de traductions des illustrations dans le Livre de Sarkar en treillis, il n'a pas été en mesure d'obtenir une légende de dendrogramme ggplot:

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

4
répondu 42- 2011-07-13 02:00:06
1
répondu wannymahoots 2017-05-23 12:26:04