2012-09-02 14 views
16

मेरे पास एक सूची है, p, जहां p का प्रत्येक तत्व ggplot2 प्लॉटिंग ऑब्जेक्ट्स की एक सूची है।एकाधिक पीजीएफ में एकाधिक ggplots प्रिंट करना, प्रति पृष्ठ एकाधिक प्लॉट्स

मैं उत्पादन के लिए p ऐसे में सभी भूखंडों कि p[[1]] में भूखंडों पेज 1 पर हैं वाली एकल पीडीएफ, p[[2]] में भूखंडों चाहते हैं पेज 2, आदि पर हैं मैं यह कर सकता है कैसे?

यहाँ डेटा संरचना के साथ मैं काम कर रहा हूँ के साथ आप प्रदान करने के लिए कुछ उदाहरण कोड है - बोरिंग भूखंडों के लिए क्षमा याचना, मैं यादृच्छिक पर चर उठाया।

require(ggplot2) 
p <- list() 

cuts <- unique(diamonds$cut) 
for(i in 1:length(cuts)){ 
    p[[i]] <- list() 
    dat <- subset(diamonds, cut==cuts[i]) 
    p[[i]][[1]] <- ggplot(dat, aes(price,table)) + geom_point() + 
     opts(title=cuts[i]) 
    p[[i]][[2]] <- ggplot(dat, aes(price,depth)) + geom_point() + 
     opts(title=cuts[i]) 
} 
+0

यहां एक संभावित प्रारंभ है: 'आवश्यकता (ग्रिडएक्स्ट्रा); do.call ("grid.arrange", पी [[मैं]]) '। वह ggplot ऑब्जेक्ट्स को पी [[i]] में एक ही डिवाइस में प्लॉट करेगा, जो उन्हें अच्छी तरह से व्यवस्थित करेगा। – Michael

+0

ग्रिडएक्स्ट्रा पैकेज में भी देखें। मुझे लगता है कि आपको – chandler

उत्तर

15

यह समाधान के स्वतंत्र है कि क्या सूची p में सूचियों की लंबाई अलग हैं।

library(gridExtra) 

pdf("plots.pdf", onefile = TRUE) 
for (i in seq(length(p))) { 
    do.call("grid.arrange", p[[i]]) 
} 
dev.off() 
onefile = TRUE समारोह pdf की वजह से

एक ही फाइल (एक ग्राफिक के लिए एक पृष्ठ) में क्रमिक रूप से दिखाई दे रहा सभी ग्राफिक्स बचाता है।

+0

पर सबसे अधिक रास्ता मिलना चाहिए यह पूरी तरह से काम किया, धन्यवाद! – Michael

+1

मेरे लिए, यह एक क्षतिग्रस्त पीडीएफ में परिणाम देता है जिसे खोला नहीं जा सकता है। भूखंड अलग-अलग दिखते हैं। कोई सुझाव? –

+0

opts() 'ggplot2_2.2.1' और' आर संस्करण 3.3.2 'पर मेरे लिए काम नहीं किया। '+ Ggtitle (कटौती [i]) का उपयोग करें' बजाय। –

2

यहाँ एक समाधान है, लेकिन मैं नहीं विशेष रूप से ऐसा लगता है जैसे:

ggsave("test.pdf", do.call("marrangeGrob", c(unlist(p,recursive=FALSE),nrow=2,ncol=1)))

समस्या यह है कि वहाँ प्रत्येक समूह में भूखंडों की संख्या समान किया जा रहा है पर निर्भर करता है। यदि all(sapply(p, length) == 2) गलत थे, तो यह टूट जाएगा।

7

यहाँ आर शुरुआती जो अन्यथा आँख बंद करके do.call का प्रयोग करेंगे और नेस्टेड सूचियों कि वे न तो आवश्यकता है और न ही समझ में लिए स्वेन के समाधान का एक सरल संस्करण है। मेरे पास अनुभवजन्य सबूत हैं। :)

library(ggplot2) 
library(gridExtra) 

pdf("plots.pdf", onefile = TRUE) 
cuts <- unique(diamonds$cut) 
for(i in 1:length(cuts)){ 
    dat <- subset(diamonds, cut==cuts[i]) 
    top.plot <- ggplot(dat, aes(price,table)) + geom_point() + 
     opts(title=cuts[i]) 
    bottom.plot <- ggplot(dat, aes(price,depth)) + geom_point() + 
     opts(title=cuts[i]) 
    grid.arrange(top.plot, bottom.plot) 
} 
dev.off() 
संबंधित मुद्दे