Воспроизведение решетчатого графа дендрограммы с помощью ggplot2

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

4 ответа

Решение

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

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


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

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

Код:

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

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

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

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

ура

дендрограммы

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

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

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

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

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

а также этот:

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

Другие вопросы по тегам