múltiples gráficos en un canvas usando ggplot2

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 diagtwigs 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.

Puede usar grid.arrange() en el paquete gridExtra de la siguiente manera:

 grid.arrange(p1, p2) 

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 rest 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.

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.