2013-12-10 10 views
15

私は私のls上にオブジェクトとしていくつかのggplotsを持っています。私はそれらを別々のファイルとして保存したいと思います(ただし、1つの大きなファイルの下にそれらをすべて保存する方法もわかります)。私はこれを読んだ:questionquestionしかし、私はコードを適応させるように見えることはできません。私はまた、hereのように1つの大きなファイルにそれらをプロットしようとしましたが、このエラーが発生します:Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list。すべてのggplotsを1つのリストにまとめるには、私が見逃していることがあります。複数のggplotsをlsから1つの別々のファイルに保存するR

これは私がこれまで試したものです:、それはその後、あなたは、単にそれらをページごとに印刷することができ、リストに

l = mget(plots) 

をあなたのプロットを持っているのがベストです

> ls() #List of objects on my ls. All the p* are my ggplots that I want to save. 
[1] "all"  "dat"  "dat2" "dat3" "data" "dlook" "dlook2" "dlook3" "i"  "look2" "mdfx" 
[12] "objects" "order" "p"  "p1"  "p10"  "p11"  "p12"  "p13"  "p14"  "p15"  "p16"  
[23] "p17"  "p18"  "p19"  "p2"  "p3"  "p4"  "p5"  "p6"  "p7"  "p8"  "p9"  

> objects<-ls() 
> plot<-objects[14:30] 
> plots 
[1] "p1" "p10" "p11" "p12" "p13" "p14" "p15" "p16" "p17" "p18" "p19" "p2" "p3" "p4" "p5" "p6" "p7" "p8" "p9" 

> class(plots) 
[1] "character" 

plots2<-as.list(plots)#Transform into a list. 

library(gridExtra) #Code suggested to create one pdf file. 
pdf("test.pdf", onefile = TRUE) 
for (i in seq(length(plots2))) { 
    do.call("grid.arrange", plots2[[i]]) 
} 
dev.off() 
+0

あなたのリンクを。また、pdfのページごとに1つのプロットを印刷しようとしていますか、それとも1ページにまとめて配置しようとしていますか? – MattLBeck

+0

これで申し訳ありませんがこれを修正します。私は両方のオプションを行う方法を知っていると思います1)個別のPDFと2)1つの大きなpdf、1つのプロットページごとに。 – GodinA

+1

あなたがいるところでは、おそらく 'mget'が必要です(' ls'は正規表現を使って項目を見つけることにも注意してください)。しかし、あらかじめ割り当てられたリストにすべてのプロットを配置するほうが、おそらくもっとシンプルに(そしてよりクリーンに)なっていたでしょう。 – joran

答えて

36

pdf("all.pdf") 
invisible(lapply(l, print)) 
dev.off() 

またはファイルごとに1つのプロットを保存し、

invisible(mapply(ggsave, file=paste0("plot-", names(l), ".pdf"), plot=l)) 

または1つのページでそれらのすべてを手配し、

ggsave("arrange.pdf", arrangeGrob(grobs = l)) 

たり、それらを手配複数のページでは2×2、

ggsave("arrange2x2.pdf", marrangeGrob(grobs = l, nrow=2, ncol=2)) 

など

(未テスト)

+1

これは非常に役に立ちます。自分の例を試してみると、空白のページが生成されます。なぜこのようなことが起こるのか? – EntryLevelR

5

の場合プロットp1,p10などが既に存在し、それらをp1.pdfなど、その後、私は、これはそれを行うべきだと思う:

lapply(plots,function(x){ggsave(file=paste(x,"pdf",sep="."),get(x))}) 

ggsave(...)は、出力ファイルのサイズと形式を指定するための引数の数を持っています。 Joranのコメントを肉付け例として

3

、およびバティストの回答への補足、これはあなたがアップフロントリストにリストや店舗のプロットを初期化する方法を次のとおりです。

plots <- list() 
plots[[1]] <- ggplot(...) # code for p1 
plots[[2]] <- ggplot(...) # code for p2 

## Depending on if your plots are scriptable, you could use a loop 

for (i in 3:10) { 
    plots[[i]] <- ggplot(...) # code for plot i 
} 

その後、このリスト、plots、バプティストの答えではlに相当します。

リストを使用するときは、リストの要素を取得するために二重括弧[[を使用する必要があるサブリストには、単一の角括弧[が使用されます。たとえば、plots[[1]]は、plotsの最初の要素であるggplotオブジェクトを返しますが、plots[1]は、その最初のプロットを要素として含む長さ1のリストを提供します。これは当初は混乱しているように思えますが、特に最初の3つのプロットをプロットしたい場合は、lの代わりにmyplots[1:3]を使用することができます。あなた自身が、x2、例えば、数字で順次x1を変数の命名キャッチするたびに(詳細は?"["を参照してください。)

を、それはあなたが代わりにリストを使用してする必要があることは良い兆候です。

+0

あなたの答えは何もかもありがとう! – GodinA

2

lapplyで作業する必要はありません。 は、すべてのあなたのプロットを含むリストがあるとします。

MyPlots = list(plot1, plot2, plot3) 

ちょうど使用:最初と同じに2番目の質問のポイントへ

pdf("all.pdf") 
MyPlots 
dev.off() 
関連する問題