2012-07-30 12 views
24

फ़ाइल करने के लिए मल्टीप्लॉट को सहेजें, मैं वास्तव में निम्न समस्या के साथ आपकी सहायता की सराहना करता हूं। मैं एक प्लॉट को एक फाइल में सहेजने के कई तरीकों से जानता हूं। मेरा सवाल है: मैं फ़ाइल में मल्टीप्लॉट को सही ढंग से कैसे सहेजूं?आर -

आरंभ करने के लिए, मैं एक अनुभवी आर उपयोगकर्ता नहीं हूं। मैं अपने प्लॉट बनाने के लिए ggplot2 का उपयोग करता हूं, और मुझे शायद एक और बात का जिक्र करना चाहिए कि मैं RStudio GUI का उपयोग करता हूं। आर कुकबुक से example का उपयोग करके, मैं एक खिड़की में एकाधिक भूखंड बनाने में सक्षम हूं।

मैं इस तथाकथित मल्टीप्लॉट को फ़ाइल (अधिमानतः जेपीईजी) में सहेजना चाहता हूं, लेकिन किसी भी तरह ऐसा करने में विफल रहता है।

मैं इस प्रकार multiplot बना रहा हूं:

##define multiplot function 
    multiplot <- function(..., plotlist=NULL, cols) { 
     require(grid) 

     # Make a list from the ... arguments and plotlist 
     plots <- c(list(...), plotlist) 

     numPlots = length(plots) 

     # Make the panel 
     plotCols = cols       # Number of columns of plots 
     plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols 

     # Set up the page 
     grid.newpage() 
     pushViewport(viewport(layout = grid.layout(plotRows, plotCols))) 
     vplayout <- function(x, y) 
      viewport(layout.pos.row = x, layout.pos.col = y) 

     # Make each plot, in the correct location 
     for (i in 1:numPlots) { 
      curRow = ceiling(i/plotCols) 
      curCol = (i-1) %% plotCols + 1 
      print(plots[[i]], vp = vplayout(curRow, curCol)) 
     } 

    } 

## define subplots (short example here, I specified some more aesthetics in my script) 
plot1a <- qplot(variable1,variable2,data=Mydataframe1) 
plot1b <- qplot(variable1,variable3,data=Mydataframe1) 
plot1c <- qplot(variable1,variable2,data=Mydataframe2) 
plot1d <- qplot(variable1,variable3,data=Mydataframe2) 

## plot in one frame 
Myplot <- multiplot(plot1a,plot1b,plot1c,plot1d, cols=2) 

यह वांछित परिणाम देता है। समस्या तब उत्पन्न होती है जब मैं किसी फ़ाइल को सहेजने का प्रयास करता हूं। मैं मैन्युअल रूप से RStudio (निर्यात -> साजिश को छवि के रूप में सहेजें) में कर सकता हूं, लेकिन मैं सब कुछ एक स्क्रिप्ट में चलाने के लिए चाहता हूं। मैं केवल subplot1d को सहेजने का प्रबंधन करता हूं (जो last_plot() है), और पूर्ण मल्टीप्लॉट नहीं।

क्या मैं अभी तक की कोशिश की है:

  1. ggsave

    ggsave(filename = "D:/R/plots/Myplots.jpg") 
    

    यह केवल subplot 1d में परिणाम का उपयोग करते हुए सहेजा जा।

  2. jpeg(), प्रिंट() और dev.off()

    jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE) 
    print(Myplot) 
    dev.off() 
    

    यह एक पूरी तरह से सफेद छवि (बस पृष्ठभूमि मुझे लगता है) में परिणाम का उपयोग करना। प्रिंट (माईप्लॉट) वापस लौटाता है।

यह सुनिश्चित नहीं है कि मैं यहां क्या कर रहा हूं। मेरी समझ की कमी आर कारण है कि मैं समाधान खोजने की कोशिश कर रहा हूं। क्या कोई यह समझा सकता है कि मैं क्या गलत कर रहा हूं और शायद मेरी समस्या को हल करने का एक तरीका सुझा सकता हूं?

+4

आप ** ग्रिडएक्स्ट्रा :: ग्रिड का भी उपयोग कर सकते हैं।व्यवस्था करें (plot1a, plot1b, plot1c, plot1d, ncol = 2) ** – dickoa

+0

ग्रिडएक्स्ट्रा पैकेज में ग्रिड.रेंज नहीं है, इसमें arrangeGrob शामिल है जो समान कार्यक्षमता प्रदान करता है। मुझे grid.arrange नामक फ़ंक्शन को भी याद रखना प्रतीत होता है, शायद लेखक ने पैकेज में फ़ंक्शन शीर्षक बदल दिए। –

+0

'grid.arrange' gridExtra में होना चाहिए। संयोग से, 'arrangeGrob' बनाम 'मल्टीप्लॉट' के लाभों में से एक यह है कि यह' ggsave' के साथ संगत है, और आप बाद में उपयोग के लिए समग्र ग्रोब स्टोर कर सकते हैं। – baptiste

उत्तर

18

इसकी वजह से Myplot आपके मल्टीप्लॉट फ़ंक्शन से लौटा हुआ मूल्य है, और यह कुछ भी नहीं देता है (इसका काम ग्राफ़ प्रिंट करना है)। आपको जेपीजी डिवाइस के साथ मल्टीप्लॉट को खोलने की आवश्यकता है:

jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE) 
multiplot(plot1a,plot1b,plot1c,plot1d, cols=2) 
dev.off() 

काम करना चाहिए।

+0

यह वास्तव में इतना आसान है! यह जानने के लिए बहुत कुछ धन्यवाद कि मेरा दृष्टिकोण क्यों काम नहीं करता था। –

17

example code (आर रसोई की किताब) का उपयोग करना, इसके लिए मुझे

png("chickweight.png") 
multiplot(p1, p2, p3, p4, cols=2) 
dev.off() 

enter image description here

+1

आप सही हैं, लेकिन आपका कोड @M_Vermeulen से थोड़ा अलग है, वह पहले 4 प्लॉट प्लॉट करती है, जो 'मल्टीप्लॉट' को ग्रिड ऑब्जेक्ट वापस करने की अपेक्षा करती है। यह हो सकता है कि 'grid.arrange' इस व्यवहार को दिखाता है? –

+0

@PaulHiemstra: मुझे नहीं लगता कि मैंने यहां एक अलग दृष्टिकोण लिया है, उदाहरण पृष्ठ पर एक नज़र डालें। असली समस्या @Spacedman द्वारा बहुत अच्छी तरह से समझाया गया था। और हाँ 'grid.arrange' वही व्यवहार दिखाएं – dickoa

+0

आपका कोड पहले से ही @ स्पेस्डैन के फिक्स को शामिल करता है, मल्टीप्लॉट को कॉल' png' के अंदर होना आवश्यक है। –

6

और पूर्णता के लिए काम करता है, के रूप में यह केवल जिसमें पिछले मुद्रित ggplot वस्तु, बचाता है ggsave काम नहीं करता है अपने मामला सिर्फ आखिरी साजिश है। यह इस तथ्य के कारण होता है कि मल्टीप्लॉट ggplot ऑब्जेक्ट्स को कुल ग्राफिक्स डिवाइस के विभिन्न सबसेट पर चित्रित करके साजिश बनाता है। Ggplot ऑब्जेक्ट्स को एक बड़े ggplot ऑब्जेक्ट में संयोजित करके और फिर ऑब्जेक्ट को प्रिंट करके प्लॉट बनाने का एक विकल्प है। यह ggsave के साथ संगत होगा। यह दृष्टिकोण arrangeGrobgridExtra पैकेज में लागू किया गया है।

+2

तकनीकी रूप से, 'arrangeGrob' "एक बड़ा ggplot ऑब्जेक्ट" नहीं बनाता है, यह कक्षा "व्यवस्था" का एक जीटीआर देता है, और यदि बच्चों की सूची में ggplots हैं, तो कक्षा को gggave को मूर्ख बनाने के लिए "ggplot" से भी विरासत में मिलता है । अधिक जानकारी के लिए – baptiste

+0

धन्यवाद। –