2013-12-10 18 views
15

l lerin üzerinde birkaç ggplot var. Bunları ayrı dosyalar olarak kaydetmek istiyorum (her ne kadar hepsini 1 büyük dosyanın altına nasıl kaydedeceğimi bilmek isterdim). Bunu okudum: question ve question Ancak kodu uyarlayamıyorum. Ben de hepsini büyük bir dosyada here önerdi ama bu hatayı almayı denedim: Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list. Bir listede tüm ggplots'ları elde etmede eksik olduğum bir şey var. SonraBirden fazla ggplots'u ls'den tek ve ayrı ayrı dosyalara kaydetme R

l = mget(plots) 

sadece onlara sayfasını-sayfa yazdırabilirsiniz

> 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

Kişisel linki tüm araziler içeren bir listesi olduğunu varsayalım . Ayrıca, bir pdf sayfası başına bir plot yazdırmaya mı çalışıyorsunuz yoksa bunları bir sayfada bir araya getirmeye mi çalışıyorsunuz? – MattLBeck

+0

Bunun için üzgünüm, bunu düzeltir. Her iki seçeneğin nasıl yapılacağını bilmek istiyorum 1) ayrı pdfs ve 2) hepsi bir büyük pdf, sayfa başına bir arsa. – GodinA

+1

Bulunduğunuz noktada, muhtemelen 'mget' istersiniz (ayrıca '' 'ın öğeleri bulmak için normal ifadeleri kullanmanıza izin vereceğini de unutmayın. Ancak, öncelikle tüm arazileri önceden tahsis edilmiş bir listeye koymak daha basit (ve daha temiz) olurdu. – joran

cevap

36

o

, liste halinde araziler olması en iyisidir:

Bu

şimdiye kadar denedim budur
pdf("all.pdf") 
invisible(lapply(l, print)) 
dev.off() 

veya dosya başına bir arsa kaydetmek

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

veya bir sayfada hepsini düzenlemek,

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

veya onlara birden sayfalarında 2x2 düzenlemek,

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

vb

(denenmemiş)

+1

Bu çok faydalıdır - kendi örneğimle girişimde bulunduğumda boş bir sayfa oluşturur. Bunun neden olabileceği hakkında bir fikrin var mı? – EntryLevelR

5

ise p1, p10, vb. parseller zaten mevcut ve bunları kaydedilmesini vb p1.pdf, o zaman bu yeter bence:

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

ggsave(...) çıkış dosyasının boyutlarını ve biçimini belirlemek için bağımsız değişkenlerin bir numarası vardır.

3

Joran yorumuna ortaya koymasıyla bir örnek ve Baptiste'in cevap çalışmasına ek olarak, bu liste halinde bir liste ve mağaza araziler başlatmak şekli şöyledir kadar ön:

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 
} 

Sonra bu liste, plots, baptiste'nin cevabında l'a karşılık gelir.

Listeleri kullanırken, tekil köşeli parantezler, [, alt liste için kullanılır; burada bir liste öğesi almak için çiftli parantez [[ kullanmanız gerekir. Örneğin, plots[[1]], plots öğesinin ilk öğesi olan ggplot nesnesini verir, ancak plots[1] size bu ilk taslağı bir öğe olarak içeren bir uzunluk listesi verecektir. Bu ilk başta kafa karıştırıcı gibi görünebilir, ancak özellikle ilk üç parselin çizimini yapmak istediğinizde mantıklıdır, o zaman baptiste örneklerinden herhangi birinde l yerine myplots[1:3] kullanabilirsiniz. (Daha fazla ayrıntı için ?"[" bakınız.)

kendinizi örneğin x1, x2, , bunun yerine bir listesini kullanarak gereken iyi bir göstergesi, sırayla numaraları ile değişkenleri adlandırma yakalamak zaman.

+0

Yanıtlarınız için çok teşekkürler! – GodinA

2

Lapply ile çalışmak zorunda olmadığınızı unutmayın.

MyPlots = list(plot1, plot2, plot3) 

Hemen kullanın: birinciyle aynı ikinci soru noktalarına

pdf("all.pdf") 
MyPlots 
dev.off() 
İlgili konular