2009-11-30 21 views
10

मैंने कल किसी ऑब्जेक्ट के भीतर एक प्लॉट संग्रहीत करने के बारे में this प्रश्न पूछा। मैंने पहले दृष्टिकोण को लागू करने की कोशिश की (मुझे पता है कि मैंने यह निर्दिष्ट नहीं किया है कि मैं अपने मूल प्रश्न में qplot() का उपयोग कर रहा था) और देखा कि यह अपेक्षा के अनुसार काम नहीं करता है।सूची में प्लॉट ऑब्जेक्ट्स को संग्रहीत करना

library(ggplot2)    # add ggplot2 

string = "C:/example.pdf"  # Setup pdf 
pdf(string,height=6,width=9) 

x_range <- range(1,50)   # Specify Range 

# Create a list to hold the plot objects. 
pltList <- list() 
pltList[] 

for(i in 1 : 16){ 

# Organise data 
y = (1:50) * i * 1000      # Get y col 
x = (1:50)         # get x col 
y = log(y)         # Use natural log 

# Regression 
lm.0 = lm(formula = y ~ x)     # make linear model 
inter = summary(lm.0)$coefficients[1,1]  # Get intercept 
slop = summary(lm.0)$coefficients[2,1]  # Get slope 

# Make plot name 
pltName <- paste('a', i, sep = '') 

# make plot object  
p <- qplot(
    x, y, 
    xlab = "Radius [km]", 
    ylab = "Services [log]", 
    xlim = x_range, 
    main = paste("Sample",i) 
) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)   

print(p)  

pltList[[pltName]] = p  
} 

# close the PDF file 
dev.off() 

मैंने इस मामले में नमूना संख्याओं का उपयोग किया है, इसलिए कोड की प्रतिलिपि बनाई गई है तो कोड चलाता है। मैंने इस पर कुछ घंटों बिताए लेकिन मुझे पता नहीं चल रहा कि क्या गलत हो रहा है। यह समस्या के बिना पीडीएफएस का पहला सेट लिखता है, इसलिए मेरे पास सही प्लॉट के साथ 16 पीडीएफ हैं।

फिर जब मैं कोड के इस टुकड़े का उपयोग करें:

string = "C:/test_tabloid.pdf" 
pdf(string, height = 11, width = 17) 

grid.newpage() 
pushViewport(viewport(layout = grid.layout(3, 3))) 

vplayout <- function(x, y){viewport(layout.pos.row = x, layout.pos.col = y)} 

counter = 1 

# Page 1 
for (i in 1:3){  
    for (j in 1:3){  
     pltName <- paste('a', counter, sep = '') 
     print(pltList[[pltName]], vp = vplayout(i,j)) 
     counter = counter + 1 
    } 
} 

dev.off() 

परिणाम मैं पिछले रेखीय मॉडल लाइन (abline) हर ग्राफ पर है, लेकिन डेटा नहीं बदलता है। जब मैं भूखंडों की अपनी सूची की जांच करता हूं, ऐसा लगता है कि वे सभी हालिया साजिश (abline ऑब्जेक्ट के अपवाद के साथ) द्वारा अधिलेखित हो जाते हैं।

एक कम महत्वपूर्ण माध्यमिक प्रश्न यह था कि प्रत्येक पृष्ठ पर कई भूखंडों के साथ एक मुली पेज पीडीएफ कैसे उत्पन्न किया जाए, लेकिन मेरे कोड का मुख्य लक्ष्य प्लॉट को उस सूची में स्टोर करना था जिसे मैं बाद की तारीख में एक्सेस कर सकता था।

उत्तर

10

ठीक है, इसलिए यदि आपके साजिश आदेश

p <- qplot(data = data.frame(x = x, y = y), 
      x, y, 
      xlab = "Radius [km]", 
      ylab = "Services [log]", 
      xlim = x_range, 
      ylim = c(0,10), 
      main = paste("Sample",i) 
      ) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)   

तो परिवर्तित करने के लिए सब कुछ उम्मीद के रूप में काम करता है। यहां मुझे संदेह है कि मुझे क्या हो रहा है (हालांकि हैडली शायद चीजों को स्पष्ट कर सकता है)। जब ggplot2 डेटा को "सहेजता है", वास्तव में यह क्या करता है डेटा फ्रेम और पैरामीटर के नामों को सहेजता है। तो आदेश के लिए के रूप में मैं इसे दे दिया है, तो आप

> summary(pltList[["a1"]]) 
data: x, y [50x2] 
mapping: x = x, y = y 
scales: x, y 
faceting: facet_grid(. ~ ., FALSE) 
----------------------------------- 
geom_point: 
stat_identity: 
position_identity: (width = NULL, height = NULL) 

mapping: group = 1 
geom_abline: colour = red, size = 1 
stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
position_identity: (width = NULL, height = NULL) 

मिल हालांकि, अगर आप qplot में एक data पैरामीटर निर्दिष्ट नहीं है, सभी चर, वर्तमान क्षेत्र में मूल्यांकन हो जाता है क्योंकि वहाँ संलग्न नहीं (पढ़ : सहेजा गया) डेटा फ्रेम।

data: [0x0] 
mapping: x = x, y = y 
scales: x, y 
faceting: facet_grid(. ~ ., FALSE) 
----------------------------------- 
geom_point: 
stat_identity: 
position_identity: (width = NULL, height = NULL) 

mapping: group = 1 
geom_abline: colour = red, size = 1 
stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
position_identity: (width = NULL, height = NULL) 

तो जब भूखंड के आसपास दूसरी बार उत्पन्न होता है, बल्कि मूल मानों का उपयोग करने से, यह x और y की वर्तमान मूल्यों का उपयोग करता।

+0

धन्यवाद आरसीएस और जोनाथन, इस समस्या को हल किया। मैं डेटा तर्क से अनजान था और डेटा को स्टोर करने के लिए इसका उपयोग कैसे किया जा सकता था। मैं अब पुस्तक के उस खंड की जांच कर रहा हूं। – womble

1

अपने दूसरे प्रश्न के लिए: बहु पेज pdfs आसान कर रहे हैं - help(pdf) देखें: अपने मुख्य प्रश्न के लिए

onefile: logical: if true (the default) allow multiple figures in one 
      file. If false, generate a file with name containing the 
      page number for each page. Defaults to ‘TRUE’. 

, मुझे समझ नहीं आता है, तो आप एक सूची में साजिश आदानों संग्रहीत करना चाहते हैं बाद में प्रसंस्करण के लिए, या साजिश आउटपुट। यदि यह उत्तरार्द्ध है, तो मुझे यकीन नहीं है कि plot() एक ऑब्जेक्ट देता है जिसे आप स्टोर और पुनर्प्राप्त कर सकते हैं।

+0

मैं साजिश आउटपुट स्टोर करने की उम्मीद कर रहा था। यदि मैं साजिश इनपुट स्टोर करता हूं, तो क्या उस समय विशेष रूप से एक्स और वाई के मान शामिल हैं? – womble

+0

बेशक। बस एक सूची में सभी फ़ंक्शन तर्क आदि संग्रहीत करें। यह बहुत मानक है। लेकिन _plot output_ को संग्रहीत करने की आपकी धारणा नहीं है। साजिश के परिणाम डिवाइस-निर्भर हैं और अधिकांशतः ओएस-निर्भर हैं। बस एक फ़ाइल, संभवतः एक बिटमैप लिखें, और इसे प्रदर्शित करें। या जीयूआई स्टाइल ऐप लिखें। या बस कई साजिश खिड़कियां खोलें। –

+0

हालांकि, 'ggplot' आपके लिए ऑब्जेक्ट्स को अच्छी तरह से वापस कर सकता है। इस मामले में एडुआर्डो का जवाब आपकी कुंजी है। –

2

सूची सबस्क्राइबिंग से संबंधित आपके कोड में एक बग है। यह होना चाहिए

pltList[[pltName]] 

pltList[pltName] 

नोट नहीं:

class(pltList[1]) 
[1] "list" 

pltList [1] एक सूची pltList के पहले तत्व युक्त है।

class(pltList[[1]]) 
[1] "ggplot" 

pltList [[1]] pltList के पहले तत्व है।

+0

क्षमा करें - मैंने पेस्ट करने के लिए जो गलती की थी उसके साथ गलती की। मैंने वाक्यविन्यास के बीच अंतर को पूरी तरह से समझ नहीं लिया और अंतर देखने के लिए इसे संपादित कर रहा था। हालांकि मेरी त्रुटि अभी भी मौजूद है जैसा कि मैंने उपरोक्त वर्णन किया है। – womble

1

आपके दूसरे प्रश्न के बारे में एक और सुझाव स्वीवे या ब्रू का उपयोग करना होगा क्योंकि वे आपको अपने बहु पृष्ठ पीडीएफ को प्रदर्शित करने के तरीके पर पूर्ण नियंत्रण देंगे।

at this related question देखें।

4

मुझे लगता है कि आपको तर्क qplot में तर्क देना चाहिए, यानी, अपने वैक्टर को डेटा फ्रेम में स्टोर करें।

हैडली की पुस्तक, धारा 4 देखें।4:

डेटा पर प्रतिबंध सरल है: यह एक डेटा फ्रेम होना चाहिए। यह प्रतिबंधित है, और आर। लैटिस फ़ंक्शन में अन्य ग्राफिक्स पैकेजों के विपरीत वैकल्पिक डेटा फ्रेम ले सकते हैं या सीधे वैश्विक वातावरण से वेक्टर का उपयोग कर सकते हैं। ...

डेटा प्लॉट ऑब्जेक्ट में एक प्रतिलिपि के रूप में संग्रहीत किया जाता है, संदर्भ नहीं। इसमें दो महत्वपूर्ण परिणाम हैं: यदि आपका डेटा बदलता है, तो साजिश नहीं होगी; और ggplot2 ऑब्जेक्ट्स पूरी तरह स्व-निहित हैं ताकि वे डिस्क() डी डिस्क और बाद में लोड() एड को सहेज सकें और उस सत्र से कुछ और की आवश्यकता के बिना प्लॉट किया जा सके।

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