2012-05-22 14 views
42
library(ggplot2) 
df <- data.frame(x=1:10, y=rnorm(10)) 
p1 <- ggplot(df, aes(x,y)) + geom_point() 
plist <- list(p1,p1,p1,p1,p1) 
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above. 

Chciałbym zorganizować działki za pomocą grid.arrange() w gridExtra.Jak ustawić zmienną listę działek za pomocą grid.arrange?

Jak to zrobić, jeśli liczba działek w plist jest zmienna?

to działa: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

ale muszę bardziej ogólne rozwiązanie. myśli?

+0

to w '? Grid.arrange' – baptiste

Odpowiedz

64

Jak o tym:

library(gridExtra) 
n <- length(plist) 
nCol <- floor(sqrt(n)) 
do.call("grid.arrange", c(plist, ncol=nCol)) 

enter image description here

+0

To jest miłe, z tym wyjątkiem, że funkcja nie może obsługiwać obiektów NULL. –

+0

Josh. Kocham Cię. Spędziłem 2 godziny na tym do teraz. Czy chciałbyś wyjaśnić, dlaczego to nie działa: 'grid.arrange (plist [[1: length (plist)]], ncol = nCol))' Otrzymuję błąd w następujący sposób: 'Błąd w hl.plots [[1 : 12]]: brak takiego indeksu na poziomie 3 "Dzięki! – Anto

+1

@Anto Z tym kodem jest kilka rzeczy błędnych, ale ten, który daje wyświetlony błąd jest prawdopodobnie spowodowany przez ten sam rodzaj błędu, jaki pokazano tutaj: 'x <- list (1,2); x [[3: 1]] ". Mówiąc szerzej, użyj czegoś takiego jak 'plist [...]' zamiast 'plist [[...]]', aby wykonać swoje podzestawy. A następnie użyj 'do.call()', którego musimy użyć, ponieważ 'grid.arrange()' nie jest skonfigurowany do pobierania listy jako swojego pierwszego argumentu. Wiwaty i powodzenia! –

4

Można użyć grid.arrange() i arrangeGrob() z listy tak długo, jak określić listę używając grobs = argument w każdej funkcji. Na przykład. na przykład daliście:

library(ggplot2) 
library(gridExtra) 
df <- data.frame(x=1:10, y=rnorm(10)) 
p1 <- ggplot(df, aes(x,y)) + geom_point() 
plist <- list(p1,p1,p1,p1,p1) 

grid.arrange(grobs = plist, ncol = 2) ## display plot 
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2)) ## save plot 
5

Dla kompletności (i jak ten stary, już odpowiedział na pytanie has been revived, recently) Chciałbym dodać rozwiązanie przy użyciu pakietu cowplot:

cowplot::plot_grid(plotlist = plist, ncol = 2) 

enter image description here

+0

każdy pomysł, dlaczego przekazanie listy działek za pomocą tego kodu zwraca ten błąd: 'Błąd w ggplot_to_gtable (x): Argument musi należeć do klasy" ggplot "lub" gtable "' –

+0

W jaki sposób wygenerowano wykresy? Używając pakietu 'ggplot2' lub grafiki podstawowej? – Uwe

+0

'ggplot2'. 'grid.arrange' prawie dla mnie działało - ale okazuje się, że moja lista działek nie jest zapełniana. Wysłałem tę kwestię jako pytanie: http://stackoverflow.com/questions/43216262/saving-multiple-ggplots-created-in-a-for-loop-to-a-single-plot. Zastanawiam się więc, czy to też mogło być problemem dla trupów –

Powiązane problemy