2013-12-10 11 views
15

में अलग-अलग फ़ाइलों को सहेजना मेरे पास मेरे ls पर ऑब्जेक्ट्स के रूप में कई ggplots हैं। मैं उन्हें अलग फाइलों के रूप में सहेजना चाहता हूं (हालांकि मुझे यह जानने में भी दिलचस्पी होगी कि उन्हें सभी को 1 बड़ी फ़ाइल के तहत कैसे सहेजना है)। मैंने इसे पढ़ा है: question और question लेकिन मैं कोड को अनुकूलित नहीं कर सकता। मैंने उन्हें here सुझाए गए अनुसार एक बड़ी फ़ाइल में प्लॉट करने की भी कोशिश की लेकिन यह त्रुटि प्राप्त करें: Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list। ऐसा कुछ है जो मुझे एक सूची में सभी ggplots प्राप्त करने में याद आ रही है।एकाधिक ggplots को ls से एक में सहेजना और R

> 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

आपका पहला रूप में एक ही करने के लिए दूसरा सवाल अंक के लिए लिंक। साथ ही, क्या आप एक पीडीएफ के प्रति पृष्ठ एक प्लॉट को मुद्रित करने की कोशिश कर रहे हैं, या उन्हें एक साथ एक पृष्ठ पर व्यवस्थित कर रहे हैं? – MattLBeck

+0

ओप्स इसके बारे में खेद है कि इसे ठीक कर देगा। मैं जानना चाहता हूं कि दोनों विकल्पों को कैसे करें 1) अलग पीडीएफ और 2) सभी एक बड़े पीडीएफ में, प्रति पृष्ठ एक साजिश। – GodinA

+1

उस बिंदु पर आप शायद 'mget'' चाहते हैं (यह भी ध्यान दें कि 'ls' आपको वस्तुओं को खोजने के लिए regex का उपयोग करने देगा)। लेकिन यह संभवतः पहले प्लॉट में सभी भूखंडों को पूर्व-आवंटित सूची में रखने के लिए सरल (और क्लीनर) होगा। – joran

उत्तर

36

यह

l = mget(plots) 

तो फिर तुम बस उन्हें पृष्ठ-दर-पृष्ठ मुद्रित कर सकते हैं किसी सूची में अपने भूखंडों के लिए सबसे अच्छा है,

:

यह वही है मैं अब तक की कोशिश की है है

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

या फ़ाइल प्रति एक साजिश बचाने के लिए,

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

या उन सब को एक ही पन्ने में व्यवस्था,

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

या उन्हें एक से अधिक पृष्ठों में 2x2 की व्यवस्था,

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

आदि

(untested)

+1

यह बहुत उपयोगी है - जब मैं अपने उदाहरण के साथ प्रयास करता हूं, तो यह एक खाली पृष्ठ बनाता है। कोई विचार क्यों ऐसा होगा? – EntryLevelR

5

हैं भूखंड p1, p10, आदि पहले से मौजूद हैं, और आप उन्हें सहेजना चाहते हैं p1.pdf, आदि, तो मुझे लगता है कि यह यह करना चाहिए:

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

ggsave(...) आयामों और आउटपुट फ़ाइल का स्वरूप निर्दिष्ट करने के लिए तर्क की एक संख्या है।

3

एक उदाहरण Joran की टिप्पणी बाहर fleshing, और बैप्टिस्ट के जवाब के लिए एक पूरक के रूप में, यह कैसे आप एक सूची में एक सूची और दुकान भूखंडों को प्रारंभ होता है सामने:

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]] आपको ggplot ऑब्जेक्ट देगा जो plots का पहला तत्व है, लेकिन plots[1] आपको एक लम्बाई सूची देगा जिसमें उस तत्व के रूप में पहली साजिश होगी। यह पहली बार भ्रमित प्रतीत हो सकता है, लेकिन यह समझ में आता है, खासकर यदि आप केवल पहले तीन भूखंडों को साजिश करना चाहते हैं, तो आप किसी भी बपतिस्मा के उदाहरणों में l के बजाय myplots[1:3] का उपयोग कर सकते हैं। (अधिक जानकारी के लिए ?"[" देखें।)

जब भी आप अपने आप को क्रमिक रूप से संख्या के साथ चर नामकरण, उदाहरण के लिए, x1, x2, , यह एक अच्छा संकेत है कि आप एक सूची के बजाय का उपयोग करना चाहिए है पकड़ने।

+0

आपके उत्तरों के लिए सभी को बहुत धन्यवाद! – GodinA

2

ध्यान दें कि आपको लापरवाही से काम करने की ज़रूरत नहीं है। मान लीजिए आप अपने सभी भूखंडों युक्त एक सूची है:

MyPlots = list(plot1, plot2, plot3) 

बस का उपयोग करें:

pdf("all.pdf") 
MyPlots 
dev.off() 
संबंधित मुद्दे