किसी ऑब्जेक्ट में प्लॉट सहेजें


83

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

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किसी ऑब्जेक्ट में बनाए गए ग्राफ़िक को सहेजना संभव है ?


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

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

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

@ Remi.b यह धन्यवाद करता है। मैंने एक समाधान पोस्ट किया जो मदद कर सकता है।
लेज़ांडेआर

जवाबों:


95

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

आप उपयोग कर सकते हैं

1- recordPlot

2- हाल ही में शुरू किया गया gridGraphicsपैकेज , बेस ग्राफिक्स को उनके ग्रिड के समकक्ष बदलने के लिए

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

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)

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

@ NLi10Me 2 विभिन्न विधियाँ।
zx8754

अगर मैं कोशिश saveRDS(object = p, file = "p.Rds"), फिर एक नया आर सत्र लोड चलाने p <- readRDS(file = "p.Rds")के बाद p, मैं एक त्रुटि कह प्राप्त Error in replayPlot(x) : loading snapshot from a different session। क्या मैं pवस्तु को गलत तरीके से सहेज रहा हूं ?
user5359531

ऐसा लगता है कि मुझे जो त्रुटि मिल रही थी वह R 3.3.0 में हल हो गई थी , उस संस्करण का उपयोग करके। जब मैंने gridGraphicsयहां दिखाई गई विधि का उपयोग किया , तो redrawn प्लॉट पर रंग गड़बड़ होते रहे, यहां तक ​​किgrid.grab(wrap=TRUE)
user5359531

34

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

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

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()

दूसरा प्लॉट करता है।

आशा है कि किसी को जो बाद में इस में ठोकर खाने में मदद करता है!


यह बहुत उपयोगी है! मुझे लगता है कि प्रीसेट प्लॉट तैयार करने के लिए यह एक बहुत अच्छा विचार है, यही मैं खोज रहा था
जोजोस्टैक

यह एक प्रतिभाशाली आधार आर दृष्टिकोण है! recordPlotनिश्चित रूप से उपयोगी है (यदि आपके पास एक खिड़की पहले से ही खुली है), लेकिन यह उत्तर बिल्कुल वैसा ही है जैसे लोग इस पद पर जाने के लिए देख रहे हैं। +1!
theforestecologist

विशेष रूप से जटिल कई भूखंडों के लिए उपयोगी है।
जो

मुझे उन लोगों के कोरस में शामिल होने दें जो वास्तव में इस ट्रिक की सराहना करते हैं। मेरे छात्रों की ओर से भी :-)
लेरिक्स डेसीडुआ

बचाव के लिए लेज़िकल स्कूपिंग! :)
जेसन

17

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

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

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

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


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

@ रेमी.बी हां बिल्कुल यह करता है। आपको इसे इस प्रकार टाइप करने की आवश्यकता है "हालांकि a %<a-% {plot(1:10);abline(v=4)}। यदि आप इसे उन घुंघराले ब्रैकेट के अंदर टाइप करते हैं, तो आपके पास जितनी चाहें उतनी पंक्तियाँ हो सकती हैं! इसके अलावा, यदि आप किसी मूल्य को फिर से असाइन करना चाहते हैं, तो आपको aइसे पहले निकालने की आवश्यकता है rm(a)और फिर इसके साथ पुन: असाइन करें। %<a-%ऑपरेटर अन्यथा आपको यह चेतावनी मिलती मैं नहीं जानता कि ऐसा क्यों होता है लेकिन मैं इसे एक बड़ी बात नहीं है लगता है।।
LyzandeR

यह वास्ताव में अच्छा है! मुझे इस पैकेज के बारे में थोड़ा पढ़ना होगा क्योंकि यह अजीब कार्य करने के लिए मुझे असंभव लगता %<a-%है। धन्यवाद
Remi.b

हाँ, यह उन बहुत ही शांत पैकेजों में से एक है जिसे हेडली ने बनाया था। यह फ़ंक्शन का एक सेट है जो आपको R भाषा को गहराई से समझने की सुविधा देता है। पर एक नज़र डालें %<d-%और साथ ही, उस पर बाद में काम में आ सकते हैं। खुशी है कि मैं मदद कर सकता हूँ :)
LyzandeR

1
@ LyzandeR बहुवचन में सहेजे गए भूखंडों को संयोजित करना संभव है?
user2300940

-4
library(ggplot2)
# if mygraph is a plot object
ggsave("myplot1.png",mygraph)

# if the plot is in a list (e.g. created by the Bibliometrics package)
ggsave("myplot1.png",mygraphs[[1]])

हालाँकि आपका उत्तर 'सही' लगता है (लेकिन मैं कोई आर प्रोग्रामर नहीं हूँ), स्टैक ओवरफ्लो पर कुछ व्याख्यात्मक पाठ जोड़ने के लिए सामान्य अभ्यास है, बजाय इसके कि केवल 'ट्रिक' कोड-केवल ब्लॉक पोस्ट किया जाए। यह लंबे समय तक और उपयोगकर्ताओं की व्यापक श्रेणी में उत्तर को अधिक मूल्यवान बनाता है। (लेकिन फिर भी, एक उत्थान है!)
एड्रियन मोल

3
ओपी ggplot2 का उपयोग किए बिना ऐसा करने के बारे में पूछ रहा था ।
जेसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.