2013-02-17 11 views
7

का उपयोग करके कई भूखंडों को व्यवस्थित करें मैंने एक प्लॉट में 11 ग्राफ फिट करने की कोशिश करने में कई घंटे बिताए हैं और उन्हें gridExtra का उपयोग करके व्यवस्थित किया है लेकिन मैं बुरी तरह विफल रहा हूं, इसलिए मैं आपको उम्मीद कर सकता हूं कि आप मदद कर सकते हैं।ग्रिडएक्स्ट्रा

मैं हीरे (इसे कहते size1) और अन्य 11 वर्गीकरण (size2) के 11 वर्गीकरण है और मैं बढ़ाने की size2 द्वारा प्लॉट करने के लिए कैसे प्रत्येक बढ़ती size1 और (6 1 से) बढ़ाने clarity के लिए औसत कीमत से भिन्न होता है चाहता हूँ हीरे, और एक ही ग्राफ में सभी 11 भूखंडों का साजिश। मैं के रूप में अन्य पदों में सुझाव दिया है, लेकिन कथा दूर सही करने के लिए दूर है और सभी रेखांकन बाईं ओर squished रहे gridExtra उपयोग करने की कोशिश, आप कृपया मदद कर सकते हैं मुझे यह पता लगाने कैसे gridExtra में लेजेंड के लिए "चौड़ाई" निर्दिष्ट होना चाहिए ? मुझे कोई अच्छी स्पष्टीकरण नहीं मिल रही है। आप अपनी मदद के लिए बहुत बहुत धन्यवाद, मैं सच में इसकी सराहना ...

मैं भी अपने डेटा फ्रेम बनाना एक अच्छा उदाहरण खोजने की कोशिश की है लेकिन असफल इस में। मुझे आशा है कि इस डेटा फ्रेम को समझने मैं क्या करने की कोशिश कर रहा हूँ में मदद करता है, मैं इसे मेरा रूप में काम करने और एक ही होना नहीं मिल सका और कुछ भूखंडों पर्याप्त डेटा नहीं है, लेकिन महत्वपूर्ण हिस्सा gridExtra का उपयोग कर रेखांकन के स्वभाव (है यानी डेटा फ्रेम में कारकों डाल) के रूप में यह एक बेमेल आकार त्रुटि फेंक दिया गया था

library(ggplot2) 
library(gridExtra) 

df <- data.frame(price=matrix(sample(1:1000, 100, replace = TRUE), ncol = 1)) 

df$size1 = 1:nrow(df) 
df$size1 = cut(df$size1, breaks=11) 
df=df[sample(nrow(df)),] 
df$size2 = 1:nrow(df) 
df$size2 = cut(df$size2, breaks=11) 
df=df[sample(nrow(df)),] 
df$clarity = 1:nrow(df) 
df$clarity = cut(df$clarity, breaks=6) 

# Create one graph for each size1, plotting the median price vs. the size2 by clarity: 
for (c in 1:length(table(df$size1))) { 

    mydf = df[df$size1==names(table(df$size1))[c],] 
    mydf = aggregate(mydf$price, by=list(mydf$size2, mydf$clarity),median); 
    names(mydf)[1] = 'size2' 
    names(mydf)[2] = 'clarity' 
    names(mydf)[3] = 'median_price' 

    assign(paste("p", c, sep=""), qplot(data=mydf, x=as.numeric(mydf$size2), y=mydf$median_price, group=as.factor(mydf$clarity), geom="line", colour=as.factor(mydf$clarity), xlab = "number of samples", ylab = "median price", main = paste("region number is ",c, sep=''), plot.title=element_text(size=10)) + scale_colour_discrete(name = "clarity") + theme_bw() + theme(axis.title.x=element_text(size = rel(0.8)), axis.title.y=element_text(size = rel(0.8)) , axis.text.x=element_text(size=8),axis.text.y=element_text(size=8))) 
    } 

# Couldnt get some to work, so use: 
p5=p4 
p6=p4 
p7=p4 
p8=p4 
p9=p4 

# Use gridExtra to arrange the 11 plots: 

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)} 

mylegend<-g_legend(p1) 


grid.arrange(arrangeGrob(p1 + theme(legend.position="none"), 
        p2 + theme(legend.position="none"), 
        p3 + theme(legend.position="none"), 
        p4 + theme(legend.position="none"), 
        p5 + theme(legend.position="none"), 
        p6 + theme(legend.position="none"), 
        p7 + theme(legend.position="none"), 
        p8 + theme(legend.position="none"), 
        p9 + theme(legend.position="none"), 
        p10 + theme(legend.position="none"), 
        p11 + theme(legend.position="none"), 
        main ="Main title", 
        left = ""), mylegend, 
        widths=unit.c(unit(1, "npc") - mylegend$width, mylegend$width), nrow=1) 
+1

'mylegendwidth' एक वेक्टर है, तो आप शायद चाहते हैं' राशि (mylegend $ चौड़ाई) 'बजाय। – baptiste

+0

आप बैप्टिस्ट धन्यवाद, यह भी काम करता है! – user971102

उत्तर

3

मैं qplot पाश कॉल थोड़ा बदलना पड़ा (: यद्यपि आप अन्य भागों पर अन्य टिप्पणी है, तो कृपया मुझे पता है) करते हैं। मैं उस बिट को शामिल नहीं कर रहा हूं क्योंकि वह हिस्सा आपके पर्यावरण में स्पष्ट रूप से काम कर रहा है या यह एक गलती पेस्ट था।

इस तरह से अपनी widths इकाइयों को एडजस्ट करने का प्रयास करें:

widths=unit(c(1000,50),"pt") 

और तुम करने के लिए थोड़ा और करीब कुछ मिल जाएगा क्या आप शायद उम्मीद कर रहे थे:

और, मैं अब कुछ ही महीने बाद कोड पेस्ट कर सकते हैं :-)

library(ggplot2) 
library(gridExtra) 

df <- data.frame(price=matrix(sample(1:1000, 100, replace = TRUE), ncol = 1)) 

df$size1 = 1:nrow(df) 
df$size1 = cut(df$size1, breaks=11) 
df=df[sample(nrow(df)),] 
df$size2 = 1:nrow(df) 
df$size2 = cut(df$size2, breaks=11) 
df=df[sample(nrow(df)),] 
df$clarity = 1:nrow(df) 
df$clarity = cut(df$clarity, breaks=6) 

# Create one graph for each size1, plotting the median price vs. the size2 by clarity: 
for (c in 1:length(table(df$size1))) { 

    mydf = df[df$size1==names(table(df$size1))[c],] 
    mydf = aggregate(mydf$price, by=list(mydf$size2, mydf$clarity),median); 
    names(mydf)[1] = 'size2' 
    names(mydf)[2] = 'clarity' 
    names(mydf)[3] = 'median_price' 
    mydf$clarity <- factor(mydf$clarity) 

    assign(paste("p", c, sep=""), 
     qplot(data=mydf, 
       x=as.numeric(size2), 
       y=median_price, 
       group=clarity, 
       geom="line", colour=clarity, 
       xlab = "number of samples", 
       ylab = "median price", 
       main = paste("region number is ",c, sep=''), 
       plot.title=element_text(size=10)) + 
      scale_colour_discrete(name = "clarity") + 
      theme_bw() + theme(axis.title.x=element_text(size = rel(0.8)), 
           axis.title.y=element_text(size = rel(0.8)), 
           axis.text.x=element_text(size=8), 
           axis.text.y=element_text(size=8))) 
} 

# Use gridExtra to arrange the 11 plots: 

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)} 

mylegend<-g_legend(p1) 


grid.arrange(arrangeGrob(p1 + theme(legend.position="none"), 
         p2 + theme(legend.position="none"), 
         p3 + theme(legend.position="none"), 
         p4 + theme(legend.position="none"), 
         p5 + theme(legend.position="none"), 
         p6 + theme(legend.position="none"), 
         p7 + theme(legend.position="none"), 
         p8 + theme(legend.position="none"), 
         p9 + theme(legend.position="none"), 
         p10 + theme(legend.position="none"), 
         p11 + theme(legend.position="none"), 
         top ="Main title", 
         left = ""), mylegend, 
      widths=unit(c(1000,50),"pt"), nrow=1) 

preview here

(16/07/2015) संपादित करें: gridExtra> = 2.0.0, main पैरामीटर का नाम बदलकर top कर दिया गया है।

+0

हाय hrbrmstr, आप आपकी मदद के लिए बहुत बहुत धन्यवाद। किंवदंती अब सही स्थिति में है। यदि संभव हो, तो क्या आप कृपया बता सकते हैं कि आपके कोड में "चौड़ाई" क्या कर रही है? – user971102

+0

मूल्य व्यक्त कर रहे हैं - "अंक" प्रत्येक कॉलम की जगह ले जाने की जगह "अंक"। तो भूखंडों के लिए भूखंडों के लिए बहुत सी जगह और किंवदंती के लिए एक छोटी सी जगह है। मैं अब कोड और छवियों को भी पेस्ट कर सकता हूं और आप देखेंगे कि मैंने सभी प्लॉट्स को सही तरीके से काम करने के लिए कोड तय किया है। – hrbrmstr