Воспроизведение решетчатого графа дендрограммы с помощью 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
Да, это. Но пока вам придется прыгнуть через несколько обручей:
- Установите
ggdendro
пакет (доступен от CRAN). Этот пакет будет извлекать информацию о кластере из нескольких типов методов кластера (включаяHclust
а такжеdendrogram
) с явной целью заговора вggplot
, - Используйте сеточную графику для создания видовых экранов и выравнивания трех разных графиков.
Код:
Сначала загрузите библиотеки и настройте данные для 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:
Эти ссылки предоставляют решение для тепловых карт с дендрограммами в ggplot2:
https://gist.github.com/chr1swallace/4672065
https://github.com/chr1swallace/random-functions/blob/master/R/ggplot-heatmap.R
а также этот: