2012-05-22 16 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. 

gridExtra numaralı belgede grid.arrange() kullanarak plotları düzenlemek istiyorum.grid.arrange kullanarak değişken bir liste nasıl düzenlerim?

plist'daki çizim sayısı değiştiğinde bunu nasıl yaparım? grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

ama daha genel bir çözüm gerek:

Bu çalışır. düşünceler? Bu konuda

+0

'? Grid.arrange' içinde – baptiste

cevap

64

Nasıl: Her işlevinde grobs = argümanı kullanarak listesini belirtmek olarak

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

enter image description here

+0

Bu işlev, NULL nesnelerini işleyemediği sürece güzel. –

+0

Josh. Seni seviyorum. Şimdiye kadar 2 saat geçirdim. Bunun neden çalışmadığını açıklamak ister misiniz: 'grid.arrange (plist [[1: uzunluk (plist)]], ncol = nCol))' Bu gibi bir hata alıyorum: 'hl.plots hatası [[1 : 12]]: Seviye 3'te böyle bir endeks yok! – Anto

+1

@Anto Bu kodda bazı yanlış şeyler var gibi görünüyor, ancak görüntülenen hatayı veren kişi, büyük olasılıkla burada gösterildiği gibi aynı hatadan kaynaklanıyor: 'x <- liste (1,2); x [[3: 1]] '. Daha geniş olarak, altkümenizi yapmak için plist [[...]] yerine plist [...] 'gibi bir şey kullanın. Ve sonra kullanmak zorunda olduğumuz 'do.call()', 'grid.arrange() ', ilk argümanı olarak bir listeyi alacak şekilde ayarlanmadığından kullanılır. Şerefe ve en iyi şans! –

4

sürece listeleri ile grid.arrange() ve arrangeGrob() kullanabilirsiniz. Örneğin. Örneğin size verdi:

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

Bütünlük adına (ve bu eski, zaten cevap soru has been revived, recently gibi) Ben cowplot paketini kullanarak bir çözüm eklemek istiyorum:

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

enter image description here

+0

herhangi bir fikir bu kodu kullanarak parsellerin bir listesini geçirmenin nedenini döndürür: 'ggplot_to_gtable (x) 'de hata: Argümanın" ggplot "veya" gtable "olması gerekiyor" 0 " –

+0

Arsalar nasıl oluşturuldu? 'Ggplot2' paketi veya temel grafiklerini kullanarak? – Uwe

+0

'ggplot2'. 'grid.arrange' neredeyse benim için işe yaradı - ancak, arsalar listemin doldurulmadığı ortaya çıkıyor. Sorunu bir soru olarak yayınladım: http://stackoverflow.com/questions/43216262/saving-multiple-ggplots-created-in-a-for-loop-to-a-single-plot. Yani, ben de bu inekbalığı için sorun olabilirdi diye merak ediyorum –

İlgili konular