2017-01-26 39 views
0

我希望能夠將ggplot2中的許多圖繪製爲單個PDF。我在下面創建了可重現的代碼,創建了我收到的錯誤消息。將多個ggplot2圖組合到PDF上

m <- matrix(data=cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow=30, ncol=3) 
df <- as.data.frame(m) 
dfs <- stack(df) 
uniqueplot1=ggplot(dfs, aes(x=values)) + geom_density() 
uniqueplot2=ggplot(dfs, aes(x=values)) + geom_density() 

objects=ls() 
plot_search=grep("uniqueplot",objects) 
objects=objects[plot_search] 

pdf("plots.pdf") 
grid.arrange(objects,ncol=2) 
dev.off() 

的錯誤,我得到的是:

Error in gList(list("uniqueplot1", "uniqueplot2", wrapvp = list(x = 0.5, : 
    only 'grobs' allowed in "gList" 
In addition: Warning message: 
In grob$wrapvp <- vp : Coercing LHS to a list 

有沒有辦法將項目objects轉換成正確的對象類型,以便它可以與grid.arrange成功地使用?

編輯:這是一個簡單的例子 - 在現實生活中,我將生產數百個情節,並且不可能單獨列出所有這些情節。

+0

會像'grid.arrange(uniqueplot1,uniqueplot2,ncol = 2)'工作嗎? –

+0

不同的方法:你之前使用過RMarkdown嗎? – Wietze314

回答

1

使用lapply(objects, get)爲了創建一個列表與您ggplot對象(因爲objects包含兩個字符的矢量"uniqueplot1" "uniqueplot2"而不是底層對象),如下面的例子:

m <- matrix(data = cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow =30, ncol = 3) 
df <- as.data.frame(m) 
dfs <- stack(df) 

uniqueplot1 <- ggplot(dfs, aes(x = values)) + geom_density() 
uniqueplot2 <- ggplot(dfs, aes(x = values)) + geom_density() 
objects  <- ls() 
plot_search <- grep("uniqueplot",objects) 
objects  <- objects[plot_search] 

pdf("plots.pdf") 
gridExtra::grid.arrange(grobs = lapply(objects, get), ncol = 2) 
dev.off() 
+0

重要的是,我保留通過ls()進行搜索的功能,就像現實生活中的示例中,我將有數百個從多個循環生成的圖,並且不可能單獨列出所有圖。 – IcedCoffee

+1

好的,你可以使用'do.call(gridExtra :: grid.arrange,c(lapply(objects,get),list(ncol = 2)))''。 我剛剛修改了我的答案 –

+0

另外,要小心,因爲在腳本中,最終的'objects'不包含'uniqueplot1'和'uniqueplot2'這兩個對象,但它只是這兩個名稱的向量。 –

0

好了, R習慣用法是將您的循環結果存儲在列表中而不是直接存儲在環境中,然後從列表中選擇所需的元素。然後,您可以使用grid.arrange的grobs參數。就像這樣,你必須適應你的榜樣。

myplots <- lapply(variables, function(v) 
       ggplot(ggplot(dfs, aes_string(x=v)) + geom_density() 
names(myplots) <- variables 
plotme <- myplots[grep("pickme", variables)] 
grid.arrange(grobs=plotme, ncol=2)