2016-09-28 15 views
8

मैं ggplot2 का उपयोग कर रेखांकन साजिश रचने कर रहा हूँ और मैं कई रेखांकन बनाने के लिए facet_wrap समारोह (~ 51) है, लेकिन वे सभी एक ही पृष्ठ पर दिखाई देते हैं। अब खोज के बाद, मुझे पता चला कि ggplot2 एकाधिक पृष्ठों पर ग्राफ नहीं रख सकता है।ggplot2: एकाधिक पृष्ठों पर भूखंड

क्या ऐसा करने का कोई तरीका है? मैंने इस सवाल को देखा (Multiple graphs over multiple pages using ggplot) और कम सफलता के साथ कोड को आजमाया।

यहां मेरे ग्राफ के लिए मेरा कोड है, यह एक पृष्ठ पर ~ 51 ग्राफ उत्पन्न करता है, जिससे उन्हें बहुत छोटा और कठिन देखना पड़ता है, अगर मैं इसे पीडीएफ में प्रति पृष्ठ 1 ग्राफ़ पर प्रिंट कर सकता हूं, तो यह बहुत अच्छा होगा:

ggplot(indbill, aes(x = prey, y = weight), tab) + 
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
facet_wrap(~ individual) + 
theme(axis.ticks.x = element_blank(), 
    axis.text.x = element_text(size=rel(0.5)), 
    axis.ticks.y = element_blank(), 
    axis.text.y = element_blank()) + 
xlab("") + ylab("") + 
guides(color = guide_legend(ncol=2)) + 
coord_radar() 

अगर कोई थोड़ा कोड लिख सकता है और मुझे समझा सकता है, तो यह बहुत अच्छा होगा!

धन्यवाद!

उत्तर

8

एक विकल्प सिर्फ साजिश, कहते हैं, एक ही कोड आप अभी उपयोग किया जा का उपयोग कर एक समय में individual के छह स्तर है। आपके डेटा के प्रत्येक उप-समूह के लिए, आपको इसे कई बार फिर से शुरू करने की आवश्यकता होगी। आप Baseball डेटा फ्रेम का उपयोग कर नमूना डेटा प्रदान की है नहीं, इसलिए यहाँ है एक उदाहरण:

library(ggplot2) 
library(vcd) # For the Baseball data 
data(Baseball) 

pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
    print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ], 
        aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw()) 
} 
dev.off() 

कोड ऊपर भूखंडों के चार पृष्ठों, एक पृष्ठ के लिए छह पहलुओं के साथ प्रत्येक के साथ एक पीडीएफ फाइल का उत्पादन करेगा। तुम भी छह पहलुओं के प्रत्येक समूह के लिए चार अलग-अलग पीडीएफ फाइलों, एक बना सकते हैं:

for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    ...ggplot code... 
dev.off() 
} 

एक अन्य विकल्प, अगर आप अधिक लचीलेपन की जरूरत है, प्रत्येक स्तर के लिए एक अलग साजिश बनाने के लिए है (जो है, प्रत्येक अद्वितीय मान) फ़ेसिंग चर के और एक सूची में सभी व्यक्तिगत भूखंडों को बचाओ। फिर आप प्रत्येक पृष्ठ पर किसी भी प्लॉट को बाहर रख सकते हैं। यही कारण है कि शायद overkill यहाँ है, लेकिन here's an example जहां लचीलापन काम में आता।

सबसे पहले, के भूखंडों के सभी बना सकते हैं। हम team87 का उपयोग हमारे फ़ेसटिंग कॉलम के रूप में करेंगे। तो हम team87 के प्रत्येक स्तर के लिए एक साजिश बनाना चाहते हैं। हम team87 द्वारा डेटा बंटवारे और डेटा के प्रत्येक सबसेट के लिए एक अलग भूखंड बनाकर यह करूँगा।

नीचे दिए गए कोड में, splitteam87 के प्रत्येक स्तर के लिए डेटा को अलग डेटा फ्रेम में विभाजित करता है। lapply आवरण क्रमिक रूप से खिलाती प्रत्येक डेटा ggplot में सबसेट हर टीम के लिए एक साजिश बनाने के लिए। हम plist में उत्पादन, (इस मामले में) की एक सूची 24 भूखंडों को बचाने के।

plist = lapply(split(Baseball, Baseball$team87), function(d) { 
    ggplot(d, aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw() + 
    theme(plot.margin=unit(rep(0.4,4),"lines"), 
      axis.title=element_blank()) 
}) 

अब हम पीडीएफ फ़ाइल में समय पर छह भूखंड रखेंगे। नीचे दो विकल्प हैं, एक चार अलग पीडीएफ फाइलों के साथ, प्रत्येक छह भूखंडों के साथ, दूसरा एक चार पेज पीडीएफ फाइल के साथ। मैंने नीचे के भूखंडों में से एक में भी चिपकाया है। अक्षरों को जोड़ने के लिए left और bottom तर्कों का उपयोग करके प्लॉट को बाहर रखने के लिए हम grid.arrange का उपयोग करते हैं।

library(gridExtra) 

# Four separate single-page PDF files, each with six plots 
for (i in seq(1, length(plist), 6)) { 
    pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
    dev.off() 
} 

# Four pages of plots in one PDF file 
pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(plist), 6)) { 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
} 
dev.off() 
+0

हाय @ eipi10! यह अद्भुत काम करता था और समझने में आसान था! हालांकि मुझे एक मुद्दा है। ऐसा लगता है कि कोड मेरे व्यक्तियों में से एक को पसंद नहीं करता है और मुझे यह त्रुटि मिल रही है। यह इस व्यक्ति को '= सूची (gList में grobs त्रुटि (705-70773 = सूची (grobs = सूची (सूची (x = 0.5, y = 0) में हिट करने के बाद प्रिंटिंग बंद कर देता है।5, "gList" में केवल 'grobs' की अनुमति है ' कोई भी मदद महान होगी! – LearningTheMacros

+1

क्या उस व्यक्ति के डेटा के बारे में कुछ ऐसा है जिसके परिणामस्वरूप कोई साजिश नहीं बनाई जा रही है? यदि कोई साजिश नहीं है, तो साजिश कोड का आउटपुट एक ग्रोब (ग्राफिक्स ऑब्जेक्ट) नहीं होगा। उदाहरण के लिए, क्या उस व्यक्ति के लिए सभी डेटा गायब हैं या ऐसा कुछ? अपनी साजिश बनाने का प्रयास करें, लेकिन उस व्यक्ति के लिए केवल डेटा के साथ डेटा फ्रेम ggplot फ़ीड करें और देखें कि क्या होता है। उस व्यक्ति के लिए डेटा देखें और देखें कि इसके बारे में कुछ स्पष्ट रूप से अलग है या नहीं। – eipi10

+0

साजिश तब बनाई गई जब मैंने हबर्टेल के सुझाव का उपयोग किया, इसलिए मुझे पता नहीं चला। किसी भी तरह से, मैं आपका जवाब समझ गया और यह भविष्य में मेरी मदद करेगा। फिर से धन्यवाद! – LearningTheMacros

2

कुछ की तरह:

by(indbill, indbill$individual, function (x){ 
    ggplot(x, aes(x = prey, y = weight), tab) + 
    geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
    theme(axis.ticks.x = element_blank(), 
     axis.text.x = element_text(size=rel(0.5)), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_blank()) + 
    xlab("") + ylab("") + 
    guides(color = guide_legend(ncol=2)) + 
    coord_radar() 
} 
संबंधित मुद्दे