2015-04-11 9 views
42

ggplot2 में, कोई आसानी से ग्राफ़िक को आर ऑब्जेक्ट में सहेज सकता है।किसी ऑब्जेक्ट में एक साजिश सहेजें

p = ggplot(...) + geom_point()  # does not display the graph 
p         # displays the graph 

मानक समारोह plot एक शून्य समारोह के रूप में ग्राफिक पैदा करता है और NULL भेजता है।

p = plot(1:10)  # displays the graph 
p     # NULL 

यह एक ग्राफिक एक वस्तु में plot द्वारा बनाई बचाने के लिए संभव है?

+0

'प्लॉट' एक सामान्य है, और अलग-अलग 'प्लॉट' विधियां ऐसी वस्तुओं को वापस लौटती हैं जहां तक ​​मुझे पता है। 'plot.default', हालांकि, वास्तव में' NULL 'देता है। –

+0

क्या आपका लक्ष्य केवल एक वस्तु के रूप में सहेजने के बाद 'p' टाइप करके अपने ग्राफ को दोहराने में सक्षम होना है? या आप इसे एक ऑब्जेक्ट के रूप में सहेजना चाहते हैं जिसे आप उदाहरण के लिए अपने मानों को बदलने में सक्षम होंगे? – LyzandeR

+0

मैं सहेजे गए ग्राफिक के शीर्ष पर अन्य ग्राफिक्स को ओवरले करना चाहता हूं लेकिन मेरा उद्देश्य उस प्लॉट को संशोधित करना नहीं है जो बनाया गया है और सहेजा गया है। क्या मैंने आपके प्रश्न का उत्तर दिया? Thks –

उत्तर

49

आधार ग्राफिक्स सीधे डिवाइस पर आकर्षित करते हैं।

आप इस्तेमाल कर सकते हैं

1- recordPlot

2- हाल ही में gridGraphics package शुरू की, उनके ग्रिड बराबर करने के लिए आधार ग्राफिक्स कन्वर्ट करने के लिए

यहाँ एक न्यूनतम उदाहरण है,

plot(1:10) 

p <- recordPlot() 
plot.new() ## clean up device 
p # redraw 

## grab the scene as a grid object 
library(gridGraphics) 
library(grid) 
grid.echo() 
a <- grid.grab() 

## draw it, changes optional 
grid.newpage() 
a <- editGrob(a, vp=viewport(width=unit(2,"in")), gp=gpar(fontsize=10)) 
grid.draw(a) 
+0

यह मेरे लिए अस्पष्ट नहीं है: क्या (1) और (2) एक ही लक्ष्य को प्राप्त करने के लिए अलग-अलग तरीके हैं, या ओपी के प्रश्न का उत्तर देने के लिए आवश्यक दोनों कदम हैं? – NLi10Me

+0

@ एनएलआई 10 एमई 2 विभिन्न तरीकों। – zx8754

11

आप यदि आप सीधे नहीं चाहते हैं तो pryr पैकेज की सक्रिय बाध्यकारी सुविधा का उपयोग कर सकते हैं बनाए गए ऑब्जेक्ट के मानों को बदलें।

library(pryr) 
a %<a-% plot(1:10,1:10) 

हर बार जब आप टाइप a सांत्वना ग्राफ स्क्रीन पर पुनः प्रकाशित किया जाएगा। %<a-% ऑपरेटर प्रत्येक बार स्क्रिप्ट को फिर से चालू करेगा (एक ग्राफ के मामले में यह कोई समस्या नहीं है)। इसलिए अनिवार्य रूप से हर बार जब आप a का उपयोग करते हैं तो कोड फिर से शुरू हो जाएगा जिसके परिणामस्वरूप आप अपना ग्राफ बना सकते हैं, उदाहरण के लिए आप png का उपयोग करके सहेज सकते हैं। हालांकि कोई मूल्य a में संग्रहीत नहीं किया जाएगा। मूल्य अभी भी शून्य होगा।

मुझे नहीं पता कि ऊपर क्या है जो आप खोज रहे हैं लेकिन यह एक स्वीकार्य समाधान हो सकता है।

+0

धन्यवाद। यह एक बहुत ही आसान समाधान है। क्या आपको पता है कि यह काम करता है अगर साजिश कई लाइनों (जैसे 'प्लॉट (1:10); उदाहरण के लिए'लाइन (v = 4)' के माध्यम से बनाई जाती है)? +1 –

+0

@ Remi.b हाँ बिल्कुल यह करता है। आपको इसे इस तरह टाइप करना होगा "'% LyzandeR

+0

यह वास्तव में अच्छा है! मुझे इस पैकेज के बारे में कुछ पढ़ना होगा क्योंकि यह अजीब कार्य करने के लिए मुझे असंभव लगता है '%

4

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

मैंने इसे किसी ऑब्जेक्ट के बजाय फ़ंक्शन का उपयोग करके हल किया। उदाहरण के लिए, मान लीजिए कि हम दो बीटा वितरणों की तुलना विभिन्न मानकों के साथ करना चाहते हैं। हम चला सकते हैं:

z1<-rbeta(10000,5,5) 
z2<-rbeta(10000,20,20) 
plotit<-function(vector,alpha,beta){ 
plot(density(vector),xlim=c(0,1)) 
abline(v=alpha/(alpha+beta),lty="longdash") 
} 

और कार्यों बजाय वस्तुओं के रूप में भूखंडों को बचाने के।

z.plot1<-function(){plotit(z1,5,5)} 
z.plot2<-function(){plotit(z2,20,20)} 

अगला, हम प्रत्येक प्लॉट को कॉल कर सकते हैं जैसा कि हम दो प्लॉट को ऑब्जेक्ट्स के बजाय कार्यों के रूप में बुलाकर चाहते हैं।

z.plot1() 

भूखंडों पहले साजिश और

z.plot2() 

भूखंडों दूसरा।

आशा है कि जो किसी के बाद इस पर ठोकर खाएगा!

संबंधित मुद्दे