2013-08-23 5 views
11

का उपयोग करने के बाद ggsave के साथ एक ग्राफ को सहेजना मैं ggplot_build (Include space for missing factor level used in fill aesthetics in geom_boxplot के समान कारण के लिए) द्वारा उत्पादित डेटा को बदलकर ggplot के साथ निर्मित ग्राफ को संशोधित कर रहा हूं। जहां तक ​​मैं इस विषय पर मिली सहायता को समझता हूं, मुझे परिणामों पर ggsave को कॉल करने से पहले ggplot_gtable को लागू करके परिणाम को सहेजने में सक्षम होना चाहिए (Saving grid.arrange() plot to file)।ggplot_build और ggplot_gtable

हालांकि मैं भी इस सरल reproductible उदाहरण के साथ एक त्रुटि "साजिश एक ggplot2 भूखंड होना चाहिए", प्राप्त:

require('ggplot2') 
require('gridExtra') 
df <- data.frame(f1=factor(rbinom(100, 1, 0.45), label=c("m","w")), 
        f2=factor(rbinom(100, 1, 0.45), label=c("young","old")), 
        boxthis=rnorm(100)) 
g <- ggplot(aes(y = boxthis, x = f2, fill = f1), data = df) + geom_boxplot() 
dd <- ggplot_build(g) 

# Printing the graph works: 
print(arrangeGrob(ggplot_gtable(dd))) 

# Saving the graph doesn't: 
ggsave('test.png',arrangeGrob(ggplot_gtable(dd))) 

किसी को भी क्यों यह काम नहीं करता व्याख्या कर सकते हैं? Ggplot_build() का उपयोग करके डेटा को संशोधित करने के बाद ggsave का उपयोग करने का कोई तरीका है?

(मेरे संकुल के संस्करण gridExtra_0.9.1 और ggplot2_0.9.3.1 कर रहे हैं)

उत्तर

23

क्योंकि ggsave वर्ग ggplot की एक वस्तु चाहता है यह काम नहीं करता है, जबकि आप एक Grob गुजर रहे हैं। arrangeGrob कभी-कभी को ggplot से वंशानुगत विरासत में चालित करेगा, लेकिन केवल तभी जब कोई भी समूह इस वर्ग से संबंधित होता है; यहां, हालांकि, आप केवल gtable पास कर रहे हैं। ggplot2 के देव संस्करण अब इस हैक * की आवश्यकता है, ggsavenow works with any grob के रूप में:

शायद सबसे आसान तरीके को ggsave क्लोन करने के लिए और कक्षा जाँच को बाइपास,

ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2] 

संपादित है।

* पीएस: यह हैक अब काम नहीं करता है, क्योंकि व्यवस्था अब एक gtable देता है, और इसकी प्रिंट विधि किसी डिवाइस पर नहीं खींची जाती है।

+0

आपको बहुत धन्यवाद, यह पूरी तरह से काम करता है। –

+1

धन्यवाद। यह, [लिंक] (http://stackoverflow.com/a/20433318/2173340) के साथ संयोजन में, 'ggsave' के साथ 'gtable' का उपयोग करके 'ggplot2' द्वारा बनाए गए प्लॉट को सहेजने की मेरी समस्या को ठीक करता है। –

+0

@ बैपटिस्ट मैंने ओवरराइटिंग 'ggsave' फ़ंक्शन के साथ अपनी चाल की कोशिश की लेकिन यह मेरे मामले में काम नहीं कर रहा है। उसी समय, 'ggplot' अभी भी '1.0.1' है और समस्या अभी तक तय नहीं है। अगर मैं आपकी विधि का उपयोग करता हूं, तो मैं 'ggsave (' test.pdf ', arrangeGrob (p1, p2)) का उपयोग करके एक पीडीएफ फ़ाइल बनाता हूं, लेकिन यह एक तरह से दूषित है। उसी समय 'gtable' कंसोल में मुद्रित हो जाता है। तो कुछ ठीक से काम नहीं कर रहा है। – drmariod

1

ग्रिड ऑब्जेक्ट को grid.draw() के साथ gtable ऑब्जेक्ट को साजिश करना है और फिर प्लॉट को फ़ाइल में स्थानांतरित करने के लिए dev.copy() का उपयोग करना है।

बस बाद में dev.off() का उपयोग करना याद रखें।