ग्रिड का उपयोग करके प्लॉटों की एक वैरिएबल सूची की व्यवस्था कैसे करूं?


92
library(ggplot2)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above.

मैं का उपयोग कर भूखंडों की व्यवस्था करना चाहते हैं grid.arrange()में gridExtra

यदि प्लॉट की संख्या plistपरिवर्तनशील है तो मैं यह कैसे करूंगा ?

यह काम: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

लेकिन मुझे और अधिक सामान्य समाधान की आवश्यकता है। विचार?

जवाबों:


139

इस बारे में कैसा है:

library(gridExtra)
n <- length(plist)
nCol <- floor(sqrt(n))
do.call("grid.arrange", c(plist, ncol=nCol))

यहाँ छवि विवरण दर्ज करें


यह अच्छा है, सिवाय इसके कि फ़ंक्शन NULL ऑब्जेक्ट्स को हैंडल नहीं कर सकता।
रोमन लुसट्रिक

जोश। मैं तुमसे प्यार करता हूँ। अब तक इस पर 2 घंटे बिता चुके हैं। क्या आप यह समझाने की परवाह करेंगे कि यह काम क्यों नहीं करता है: grid.arrange(plist[[1:length(plist)]], ncol = nCol))मुझे इस तरह एक त्रुटि मिलती है: Error in hl.plots[[1:12]] : no such index at level 3धन्यवाद!
एंटो

2
@Anto उस कोड के साथ कई चीजें गलत लगती हैं, लेकिन जो आपको प्रदर्शित त्रुटि देता है वह संभवतः उसी तरह की त्रुटि के कारण होता है जैसा कि यहां दिखाया गया है x <- list(1,2); x[[3:1]]:। अधिक मोटे तौर पर, अपनी सब्मिट करने के plist[...]बजाय कुछ का उपयोग plist[[...]]करें। और फिर उपयोग करें do.call(), जिसका हमें उपयोग करना है क्योंकि grid.arrange()सूची को इसके पहले तर्क के रूप में लेने के लिए सेट नहीं किया गया है। चियर्स, और शुभकामनाएँ!
जोश ओ'ब्रायन

31

जब तक आप प्रत्येक फ़ंक्शन में तर्क का उपयोग करके सूची निर्दिष्ट करते हैं, तब तक आप उपयोग कर सकते हैं grid.arrange()और arrangeGrob()सूचियों के साथ grobs =। उदाहरण में आपने जो उदाहरण दिया है:

library(ggplot2)
library(gridExtra)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

grid.arrange(grobs = plist, ncol = 2) ## display plot
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2))  ## save plot

1
मुझे इस जवाब को खोजने के लिए बहुत लंबा रास्ता तय किया ... धन्यवाद! यह सबसे सरल है।
मैट एल।

16

पूर्णता के लिए (और जैसा कि यह पुराना है, पहले से ही उत्तर दिया गया प्रश्न पुनर्जीवित किया गया है, हाल ही में ) मैं cowplotपैकेज का उपयोग करके एक समाधान जोड़ना चाहूंगा :

cowplot::plot_grid(plotlist = plist, ncol = 2)

यहाँ छवि विवरण दर्ज करें


किसी भी विचार क्यों इस कोड का उपयोग कर भूखंडों की एक सूची से गुजरना इस त्रुटि को लौटाता है: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie

भूखंड कैसे उत्पन्न हुए? ggplot2पैकेज या बेस ग्राफिक्स का उपयोग करना ?
Uwe

ggplot2grid.arrangeलगभग मेरे लिए काम किया - लेकिन, पता चला है कि भूखंडों की मेरी सूची आबाद नहीं हो रही है। मैंने इस मुद्दे को एक प्रश्न के रूप में पोस्ट किया है: stackoverflow.com/questions/43216262/… । इसलिए, मैं सोच रहा हूँ कि क्या यह गायपलट के लिए भी मुद्दा हो सकता है
geog_newbie

10

मुझे पता है कि प्रश्न विशेष रूप से ग्रिडएक्स्ट्रा पैकेज का उपयोग करते हुए कहा गया है, लेकिन पैचवर्क पैकेज wrap_plotsसे फ़ंक्शन चर लंबाई सूची को संभालने का एक शानदार तरीका है:

library(ggplot2)
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

wrap_plots(plist)

यहाँ छवि विवरण दर्ज करें

इसके बारे में एक उपयोगी बात यह है कि आपको यह निर्दिष्ट करने की आवश्यकता नहीं है कि कितने स्तंभों की आवश्यकता है, और स्तंभों और पंक्तियों की संख्या को बराबर रखने का लक्ष्य रखेगा। उदाहरण के लिए:

plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1)
wrap_plots(plist) # produces a 4 col x 4 row plot

यहां पैचवर्क पैकेज के बारे में अधिक जानकारी प्राप्त करें


मैं उस पैकेज को स्थापित करने के लिए प्रतीत नहीं हो सकता, जिसका आपने यहां उल्लेख किया है
baxx

क्या आपने इंस्टॉलेशन लाइन चलाने की कोशिश की है जो ऊपर टिप्पणी की गई है devtools::install_github("thomasp85/patchwork")?
माइकल हार्पर

धन्यवाद, मैंने नहीं किया। मैंने सिर्फ RStudio से इंस्टॉल का उपयोग करने की कोशिश की।
19x बजे baxx

1
पैकेज अभी तक CRAN पर उपलब्ध नहीं है, इसलिए आपको इसे GitHub के माध्यम से इंस्टॉल करना होगा। उम्मीद है कि यह बहुत लंबे समय के लिए मामला नहीं होगा, क्योंकि यह एक उत्कृष्ट पैकेज है!
माइकल हार्पर

1

एक पृष्ठ पर सभी भूखंडों को फिट करने के लिए आप इस तरह कॉलम और पंक्तियों की संख्या की गणना कर सकते हैं:

x = length(plots)

cols = round(sqrt(x),0)
rows = ceiling(x/cols)

अधिकांश प्लॉटिंग फ़ंक्शंस में ncol और nrow होते हैं, जैसे कि आप तर्क को सिर्फ इन में डाल सकते हैं। मुझे ggpubr से गार्ग्रेन पसंद है।

ggarrange(plotlist = plots, ncol=cols, nrow = rows)

यदि आप विपरीत चाहते हैं तो स्तंभों की तुलना में यह अधिक पंक्तियों का पक्षधर है। यानी 6 भूखंडों के लिए यह 3 पंक्तियों और 2 स्तंभों को दूसरी तरह से नहीं देगा।

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