2012-06-13 18 views
7

Jeśli mam data.frame dat i chce wykreślić grupy danych przy użyciu facet_wrap:stałe „numer” działek za pomocą 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) 

To wygląda świetnie i działa zgodnie z oczekiwaniami. Jednakże, jeśli wykreślić kolejny zestaw z na nowej działki:

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

nie mam już 3 wiersze i 3 kolumny. Mogę naprawić proporcje działek przy użyciu opts(aspect.ratio = 1), ale nadal mam je inaczej ułożone, niż mój poprzedni wątek. Chciałbym, aby wyglądało tak, jak gdyby na stronie zawsze było 9 działek, nawet jeśli jest ich 6 lub 1. Czy to możliwe?

Odpowiedz

9

Spróbuj tego,

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

Dzięki, to się stanie. Miałem nadzieję, że zrobię to tylko w "ggplot" bez 'gridExtra' chociaż. Przyjmuję twoją odpowiedź trochę, jeśli nikt nie wymyśli sposobu. – Justin

1

library(cowplot) zapewnia poręczną funkcję plot_grid które możemy wykorzystać w celu ustalenia wykazu działek.

Po pierwsze, pozwala skonstruować listę poszczególnych działek:

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

Teraz możemy układać panele używając 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

Powiązane problemy