2012-06-13 16 views
7

Si tengo un hoja.de.datos dat y desea trazar grupos de datos usando facet_wrap:fijo "número" de parcelas utilizando facet_wrap

dat <- data.frame(x = runif(150), y = runif(150), z = letters[1:15]) 

ggplot(dat[dat$z %in% letters[1:9], ], aes(x, y)) + 
    geom_point() + 
    facet_wrap(~ z, ncol = 3, nrow = 3) 

Esto se ve muy bien y funciona como se esperaba. Sin embargo, si yo trazo la siguiente serie de z en un nuevo solar:

ggplot(dat[dat$z %in% letters[10:15], ], aes(x, y)) + 
    geom_point() + 
    facet_wrap(~ z, ncol = 3, nrow = 3) 

ya no tienen 3 filas y 3 columnas. Puedo arreglar las proporciones de aspecto de las parcelas usando opts(aspect.ratio = 1) pero todavía las tengo distribuidas de forma diferente a mi trama anterior. Me gustaría que parezca que siempre hay 9 tramas en la página, incluso si hay 6 o 1. ¿Es posible?

Respuesta

9

Prueba de esto,

library(ggplot2) 
library(plyr) 
library(gridExtra) 

dat <- data.frame(x=runif(150), y=runif(150), z=letters[1:15]) 

plotone = function(d) ggplot(d, aes(x, y)) + 
    geom_point() + 
    ggtitle(unique(d$z)) 

p = plyr::dlply(dat, "z", plotone) 
g = gridExtra::marrangeGrob(grobs = p, nrow=3, ncol=3) 
ggsave("multipage.pdf", g) 
+0

Gracias, eso servirá. Sin embargo, esperaba hacer esto solo en 'ggplot' sin' gridExtra'. Aceptaré tu respuesta un poco si a nadie se le ocurre algo. – Justin

1

library(cowplot) proporciona una función útil plot_grid que podemos utilizar para organizar una lista de parcelas.

En primer lugar, vamos a construir la lista de las parcelas individuales:

p = lapply(unique(dat$z), function(i){ 
     ggplot(dat[dat$z == i, ], aes(x, y)) + 
     geom_point() + 
     facet_wrap(~z) 
     }) 

Ahora podemos arreglar los paneles utilizando plot_grid:

plot_grid(plotlist = p[1:9], nrow = 3, ncol = 3) 

enter image description here

plot_grid(plotlist = p[10:15], nrow = 3, ncol = 3) 

enter image description here

Cuestiones relacionadas