torta - superponer graficas en r ggplot
Reproducción de un gráfico de dendrograma de celosía con ggplot2 (4)
Como dice Ben, todo es posible. Se han realizado algunos trabajos para apoyar los dendrogramas. Andrie de Vries ha hecho un método fortify de objetos de árbol. Sin embargo, el gráfico resultante no es tan bonito como puedes ver.
El mosaico sería fácil de hacer. Para el dendrograma inspeccionaría plot.dendrogram
(usando getAnywhere
) para ver cómo se calculan las coordenadas para los segmentos. Extraiga esas coordenadas y use geom_segment para trazar el dendrograma. Luego use viewports para trazar las fichas y el dendrograma juntos. Lo siento, no puedo dar un ejemplo, es mucho trabajo y es demasiado tarde.
espero que esto ayude
Aclamaciones
¿Es posible reproducir esta trama de celosía con 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))))
Dudoso. No veo ninguna función en el Índice para ggplot2 que sugiera soporte para dendrogramas, y cuando este blogger compiló un conjunto de traducciones de las ilustraciones en el libro Lattice de Sarkar, no pudo obtener una leyenda de dendrograma de ggplot:
Estos enlaces proporcionan una solución para heatmaps con dendrogramas en ggplot2:
https://gist.github.com/chr1swallace/4672065
https://github.com/chr1swallace/random-functions/blob/master/R/ggplot-heatmap.R
y también este:
EDITAR
A partir del 8 de agosto de 2011, el paquete ggdendro
está disponible en CRAN Observe también que la función de extracción de dendrograma ahora se llama dendro_data
lugar de cluster_data
Sí lo es. Pero por el momento tendrás que pasar por algunos aros:
- Instale el paquete
ggdendro
(disponible desde CRAN). Este paquete extraerá la información del clúster de varios tipos de métodos de clúster (incluidosHclust
ydendrogram
) con el propósito expreso de trazar enggplot
. - Use gráficos de cuadrícula para crear ventanas gráficas y alinee tres gráficas diferentes.
El código:
Primero cargue las bibliotecas y configure los datos para 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")
Extrae datos de dendrograma y crea las tramas
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
Utilice gráficos de cuadrícula y una alineación manual para colocar los tres gráficos en la página
### 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))