superponer - múltiples gráficos en un lienzo usando ggplot2
superponer graficas en r ggplot (3)
Estoy intentando fusionar dos ggplot2 gráficas en una basada en esta tabla:
Type RatingA RatingB
1 One 3 36
2 Two 5 53
3 One 5 57
4 One 7 74
5 Three 4 38
6 Three 8 83
Quiero hacer dos diagramas de dispersión con la media de las clasificaciones en el eje y y escribir en el eje x.
Así es como creo cada gráfico:
p1 <- ggplot(test, aes(x=reorder(Type, RatingA, mean), y=RatingA)) +
stat_summary(fun.y="mean", geom="point")
p2 <- ggplot(test, aes(x=reorder(Type, RatingB, mean), y=RatingB)) +
stat_summary(fun.y="mean", geom="point")
Como p1 y p2 tienen el mismo eje x, me gustaría que se ordenen verticalmente. Miré facet_align pero no pude encontrar algo que hiciera el trabajo.
Julio,
Menciona que p1 y p2 tienen el mismo eje x, pero el reordenamiento que hace en base a la media no los hace iguales. El eje de p1
va "uno -> dos -> tres", mientras que el eje de p2
va "dos -> uno -> tres". Es esto intencional?
A pesar de todo, ggplot
ofrece algunas otras soluciones para combinar estas gráficas en una sola, a saber, el colour
y la faceting
(¿es posible que ya hayas probado?). El primer paso para cualquiera de estos es melt
su data.frame a formato largo. Identificaremos la variable de identificación "Tipo" y melt
asume que el resto de las columnas se melt
.
test.m <- melt(test, id.var = "Type")
Una comprobación rápida de la estructura del nuevo objeto indica que todo está en línea, excepto que los niveles de tipo están un poco fuera de control:
> str(test.m)
''data.frame'': 12 obs. of 3 variables:
$ Type : Factor w/ 3 levels "One","Three",..: 1 3 1 1 2 2 1 3 1 1 ...
$ variable: Factor w/ 2 levels "RatingA","RatingB": 1 1 1 1 1 1 2 2 2 2 ...
$ value : int 3 5 5 7 4 8 36 53 57 74 ...
Así que revisemos los niveles:
test.m$Type <- factor(test.m$Type, c("One", "Three", "Two"), c("One", "Two", "Three"))
Ahora para el trazado. Con color:
ggplot(test.m, aes(x = Type, y = value, group = variable, colour = variable)) +
stat_summary(fun.y = "mean", geom = "point")
o con facetas:
ggplot(test.m, aes(x = Type, y = value, group = variable)) +
stat_summary(fun.y = "mean", geom = "point") +
facet_grid(variable ~ ., scales = "free")
Nota: utilicé el argumento scales = "free"
en la facetación para que cada gráfico tenga su propia escala. Simplemente elimine ese argumento si ese no es el efecto que desea.
Puede usar grid.arrange()
en el paquete gridExtra de la siguiente manera:
grid.arrange(p1, p2)
esta es una vieja pregunta, pero recientemente encontré la función multiplot
, con hacer su trabajo muy bien.
La función multiplot
es de Cookbook for R:
La función en sí es:
# Multiple plot function
#
# ggplot objects can be passed in ..., or to plotlist (as a list of ggplot objects)
# - cols: Number of columns in layout
# - layout: A matrix specifying the layout. If present, ''cols'' is ignored.
#
# If the layout is something like matrix(c(1,2,3,3), nrow=2, byrow=TRUE),
# then plot 1 will go in the upper left, 2 will go in the upper right, and
# 3 will go all the way across the bottom.
#
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
require(grid)
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# If layout is NULL, then use ''cols'' to determine layout
if (is.null(layout)) {
# Make the panel
# ncol: Number of columns of plots
# nrow: Number of rows needed, calculated from # of cols
layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
ncol = cols, nrow = ceiling(numPlots/cols))
}
if (numPlots==1) {
print(plots[[1]])
} else {
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
# Make each plot, in the correct location
for (i in 1:numPlots) {
# Get the i,j matrix positions of the regions that contain this subplot
matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
layout.pos.col = matchidx$col))
}
}
}
Solo necesita obtener esta función en su secuencia de comandos.