2012-06-13 19 views
7

Se ho un data.frame dat e voglio tracciare gruppi di dati utilizzando facet_wrap:"numero" fisso di trame utilizzando 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) 

Questo sembra grande e si esibisce come previsto. Tuttavia, se tracciare la prossima serie di z su una nuova trama:

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

non ho più 3 righe e 3 colonne. Posso correggere i rapporti di aspetto dei grafici usando opts(aspect.ratio = 1) ma li ho ancora disposti in modo diverso rispetto alla trama precedente. Mi piacerebbe che appaia come se ci fossero sempre 9 grafici sulla pagina anche se ce ne sono 6 o 1. È possibile?

risposta

9

Prova questo,

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

Grazie, lo farò. Speravo di farlo solo con 'ggplot' senza' gridExtra'. Accetterò la tua risposta tra un po 'se nessuno ti presenterà un modo. – Justin

1

library(cowplot) fornisce una comoda funzione plot_grid che possiamo usare per organizzare una lista di trame.

In primo luogo, permette di costruire la lista di singoli appezzamenti:

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

Ora possiamo organizzare i pannelli utilizzando 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

Problemi correlati