Воспроизведение решеточного графа дендрограммы с помощью ggplot2 - PullRequest
35 голосов
/ 13 июля 2011

Возможно ли воспроизвести этот решеточный график с помощью 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

Ответы [ 4 ]

51 голосов
/ 13 июля 2011

РЕДАКТИРОВАТЬ

С 8 августа 2011 года пакет ggdendro доступен на CRAN Обратите внимание, что функция извлечения дендрограммы теперь называется dendro_data вместоcluster_data


Да, это так.Но на данный момент вам придется прыгнуть через несколько обручей:

  1. Установить пакет ggdendro (доступный в CRAN).Этот пакет будет извлекать информацию о кластере из нескольких типов методов кластера (включая Hclust и dendrogram) с явной целью построения графиков в ggplot.
  2. Использование сетки для создания видовых экранов и выравнивание трех разныхplots.

enter image description here

Код:

Сначала загрузите библиотеки и настройте данные для 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")

Извлечение данных дендрограммы и создание графиков

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

Используйте сеточную графику и некоторое ручное выравнивание, чтобы расположить три графика на странице

### 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))
6 голосов
/ 13 июля 2011

Как говорит Бен, все возможно.Была проделана некоторая работа по поддержке дендрограмм.Андри де Врис создал метод укрепления древовидных объектов.Тем не менее, результирующая графика не так хороша, как вы видите.

Плитка будет легко сделать.Для дендрограммы я бы проверил plot.dendrogram (используя getAnywhere), чтобы увидеть, как рассчитываются координаты для сегментов.Извлеките эти координаты и используйте geom_segment для построения дендрограммы.Затем используйте видовые окна, чтобы построить плитки и дендрограмму вместе.Извините, я не могу привести пример, много работы, и уже слишком поздно.

Надеюсь, это поможет

Ура

dendrogram

4 голосов
/ 13 июля 2011

Сомнительный.Я не вижу никаких функций в индексе для ggplot2, которые бы предлагали поддержку дендрограмм, и когда этот блоггер собрал набор переводов иллюстраций в книге решетки Саркара, он не смог получить легенду дендрограммы ggplot:

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

1 голос
/ 02 апреля 2014

Эти ссылки предоставляют решение для тепловых карт с дендрограммами в ggplot2:

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

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

, а также это:

Выровнять графики ggplot2 по вертикали

...