2012-05-22 57 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中使用grid.arrange()的地塊。如何使用grid.arrange來安排變量列表的圖表?

如果plist中的地塊數量是可變的,我該如何做到這一點?

這工作: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

,但我需要一個更通用的解決方案。想法?

+0

這是'?grid.arrange' – baptiste

回答

64

如何:

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

enter image description here

+0

這很好,除了函數不能處理NULL對象。 –

+0

喬希。我愛你。迄今爲止花了2個小時。你是否想解釋爲什麼這不起作用:'grid.arrange(plist [[1:length(plist)]],ncol = nCol))'我得到這樣的錯誤:'hl.plots [[1 :12]]:在3級沒有這樣的索引'謝謝! – Anto

+1

@Anto該代碼似乎有幾個錯誤,但是給出顯示錯誤的錯誤可能是由與此處顯示的相同類型的錯誤導致的:'x < - list(1,2); X [[3:1]]'。更廣泛地說,使用'plist'而不是'plist [[...]]'來做你的子集。然後使用'do.call()',我們必須使用它,因爲'grid.arrange()'沒有設置爲列表作爲其第一個參數。歡呼,祝你好運! –

4

您可以使用grid.arrange()arrangeGrob()與清單,只要你使用每個功能的grobs =參數中指定的列表。例如。在這個例子中,你給:

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

爲了完整起見(且在這種老的,已經回答的問題has been revived, recently)我想用cowplot包添加一個解決方案:

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

enter image description here

+0

任何想法爲什麼通過使用此代碼的圖表列表返回此錯誤:'ggplot_to_gtable(x)中的錯誤: 參數需要是類「ggplot」或「gtable」' –

+0

圖表是如何生成的?使用'ggplot2'包或基礎圖形? – Uwe

+0

'ggplot2'。 'grid.arrange'幾乎爲我工作 - 但是,事實證明我的地塊列表沒有被填充。我將該問題作爲問題發佈:http://stackoverflow.com/questions/43216262/saving-multiple-ggplots-created-in-a-for-loop-to-a-single-plot。所以,我想知道這是否也是牛棚的問題 –