2017-01-26 7 views
0

ggplot2から1つの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 

は、それが正常にgrid.arrangeで使用できるように、正しいオブジェクト型に項目objectsを変換する方法はありますか?

編集:これは単純な例です。実際には何百ものプロットが生成されますが、これらのすべてを個別にリストすることはできません。

+0

'grid.arrange(uniqueplot1、uniqueplot2、ncol = 2)'のようになりますか? –

+0

別のアプローチ:以前にRMarkdownを使用しましたか? – Wietze314

答えて

1

使用lapply(objects, get)あなたとggplotオブジェクトをリストを作成するために、(objectsが含まれているため、2つの文字のベクトル"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'という2つのオブジェクトが含まれていないので注意してください。 –

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) 
関連する問題