फाइल करने के लिए बचत ग्रिड (व्यवस्था)


137

मैं कई भूखंडों का उपयोग करने की कोशिश कर रहा हूं ggplot2, उनके उपयोग की व्यवस्था कर रहा हूं grid.arrange()। चूँकि मैंने किसी व्यक्ति को मेरे द्वारा बताई गई सटीक समस्या का वर्णन करने में कामयाबी हासिल की, इसलिए मैंने समस्या के वर्णन को लिंक से उद्धृत किया है :

जब मैं के ggsave()बाद grid.arrange(), यानी का उपयोग करें

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

मैं ग्रिड प्लॉट नहीं बचा लेकिन अंतिम व्यक्तिगत ggplot। क्या वास्तव में भूखंड को बचाने का कोई तरीका है जैसा कि कुछ इसी तरह grid.arrange()का उपयोग करके प्रदर्शित किया गया है ggsave()? पुराने तरीके का उपयोग करने के अलावा

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

वही लिंक नीचे समाधान देता है:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

हालाँकि, मैं यह पता नहीं लगा सकता कि निम्नलिखित कोड में कॉल ggsave()के आउटपुट को बचाने के लिए कैसे उपयोग किया जाए grid.arrange(), जो लिंक से लिया गया है :

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?

6
उपयोगpng(); grid.arrange(); ggplot(); ggplot(); dev.off()
एंड्री

2
नहीं है print(ggplot())?
IRTFM

@Din, हाँ, शायद! :-)
एंड्री

1
@ और आप जो सुझाव देते हैं वह काम करता है, लेकिन छवि का रिज़ॉल्यूशन बहुत कम है। जब मैं किसी एकल ggplotका उपयोग करके बचत करता हूं ggsave(), तो छवि का रिज़ॉल्यूशन बहुत अधिक होता है। क्या grid.arrange()एक उच्च रिज़ॉल्यूशन के साथ आउटपुट को बचाने का एक तरीका है , जैसे कि यह होगा कि क्या एक सिंगल प्लॉट के साथ बचाया गया था ggsave()? यदि मैं उदाहरण के लिए विकल्प प्रदान करता हूं png(...,height=1600, width=2500)तो छवि बहुत धुंधली दिखती है।
मुझे

जवाबों:


142

grid.arrangeएक डिवाइस पर सीधे खींचता है। arrangeGrobदूसरी ओर, कुछ भी आकर्षित नहीं करता है, लेकिन एक grob देता है g, जिसे आप पास कर सकते हैं ggsave(file="whatever.pdf", g)

इसका कारण यह अलग-अलग तरीके से काम करता है ggplot ऑब्जेक्ट के साथ, जहां डिफ़ॉल्ट रूप से अंतिम प्लॉट को सहेजा जा रहा है यदि निर्दिष्ट नहीं है, तो क्या यह है कि ggplot2 अदृश्य रूप से नवीनतम प्लॉट का ट्रैक रखता है, और मुझे नहीं लगता कि grid.arrangeइस काउंटर के साथ पैकेज में निजी गड़बड़ करनी चाहिए।


3
जब मैं यह कोशिश करता हूं तो मुझे एक त्रुटि मिलती है जो मुझे बताती है कि जी सही प्रकार का नहीं है?
जैक एडले

@JackAidley एक नया प्रश्न पूछता है, जिसमें न्यूनतम स्व-निहित प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है, और आपका सेशनइन्फो () (सुनिश्चित करें कि आपके पास हाल के संस्करण आर और पैकेज हैं)।
बैपटिस्ट

3
@DaveX कृपया इस भ्रामक जानकारी का प्रसार न करें; plot(g)है एक gtable, उपयोग प्रदर्शित करने के लिए सही तरीके से grid.draw(g)करने के बजाय।
बपतिस्मा

@baptiste धन्यवाद एवं reworked: ध्यान दें कि का परिणाम अगर आप देखने की कोशिश g <-arrangeGrob(...)के साथ print(g)ग्राफिक बजाय वस्तुओं आप ग्राफिक लिस्टिंग एक पाठ तालिका मिलता है। grid.draw(g)ग्राफिक्स के रूप में ग्राफिक को रेंडर करने की कोशिश करें । -
डेव एक्स

7
ggsave अब (कुछ या सभी) ग्रब्स के साथ काम नहीं कर रहा है।
वक

47

मुझे बैपटिस्ट के प्रस्ताव के साथ कुछ समस्याएं थीं, लेकिन आखिरकार मिल गया। यहाँ आप का उपयोग करना चाहिए:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

यह अच्छी तरह से काम करना चाहिए।


24

एक और आसान तरीका एक ग्रिड को बचाने के लिए। एक पीडीएफ फाइल के लिए व्यवस्थित करें पीडीएफ () का उपयोग करें:

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

यह व्यवस्था में ggplots के अलावा अन्य चीजों को मर्ज करने की अनुमति देता है, जैसे टेबल ...


7

मुझे लगा कि यह इसको जोड़ने लायक है। मुझे उपरोक्त समस्याओं के साथ समस्या थी, एक त्रुटि उत्पन्न करने वाले गैग्स के साथ: "प्लॉट एक ggplot2 प्लॉट होना चाहिए"

इस उत्तर के लिए धन्यवाद: ggplot_build और ggplot_gtable का उपयोग करने के बाद ggsave के साथ एक ग्राफ को सहेजना मेरे पास उपरोक्त कोड में संशोधन है।

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

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

त्रुटि को ठीक करने के लिए उपरोक्त पंक्ति की आवश्यकता है

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

अब यह मेरे लिए ठीक काम करता है।


मुझे इसकी जरूरत थी। जाहिरा तौर पर ggplot2 का विकास संस्करण इस तरह वर्ग-परीक्षण-दोष को हटाता है, लेकिन वर्तमान में CRAN संस्करण (2015-10-21) नहीं है।
डेव एक्स

2
यह मेरे लिए marrangeGrob के साथ काम करता है, लेकिन अरेंजग्रोब या ग्रिड के साथ नहीं। धन्यवाद!
k13

3

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

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

2

एक और सरल उपाय: बस आपके बाद grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

आप ए dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.