2012-03-12 9 views
13

ggplot2 में छायांकित क्षेत्रों के उपयोग के संबंध में fewposts हैं, लेकिन मुझे नहीं लगता कि कोई भी मेरे प्रश्न का उत्तर देता है। मेरे पास कई स्थितियों में लाइनों के लिए दो ढलान हैं, और मैं उनके बीच के क्षेत्र को छाया करना चाहता हूं।r - ggplot2 - दो geom_abline परतों के बीच एक छायांकित क्षेत्र बनाएं

dat <- data.frame(cond1=c("a","a","b","b"), 
       cond2=c("c","d","c","d"), 
       x=c(1,5), 
       y=c(1,5), 
       sl=c(1,1.2,0.9,1.1), 
       int=c(0,0.1,0.1,0), 
       slopeU=c(1.1,1.3,1.2,1.2), 
       slopeL=c(.9,1,0.7,1)) 

यहाँ, sl एक अलग फिटिंग प्रक्रिया से मतलब ढलान पैरामीटर है, और slopeU और slopeL प्रत्येक हालत में ढलान अनुमान पर ऊपरी और निचले आत्मविश्वास क्षेत्रों का प्रतिनिधित्व करते हैं: यहाँ उदाहरण डेटा है। हस्तक्षेप एक जैसा होने के लिए बाध्य हैं।

p <- ggplot(dat,aes(x=x,y=y,colour=cond1)) 
p <- p + facet_grid(. ~ cond2) 
p <- p + geom_blank() 
p <- p + geom_abline(aes(intercept=int,slope=sl,colour=cond1),data=dat) 
p 

मैं इसी में alpha=.5 पर लाइनों intercept=int, slope=slopeU और intercept=int, slope=slopeL साजिश और छाया उन्हें (उदाहरण के लिए के बीच इस क्षेत्र के लिए द्वारा परिभाषित जोड़ना चाहते हैं: निम्न कोड प्रत्येक शर्त के लिए सबसे अच्छा फिटिंग लाइनों कुछ faceting का उपयोग कर भूखंडों cond1 रंग)।

मुझे पता है कि थोड़ा हेरफेर के साथ मैं कम से कम दो एक्स मानों के लिए इन पंक्तियों के मान निर्दिष्ट करने वाले डेटा फ्रेम बना सकता हूं, फिर छायांकित क्षेत्र बनाने के लिए संबंधित geom_ribbon या geom_polygon को प्लॉट करें, हालांकि मैं और अधिक खोजना चाहता हूं सुरुचिपूर्ण समाधान। या ढलानों से कुछ निर्देशांक मैन्युअल रूप से निर्दिष्ट कर रहा है और एकमात्र तरीके से हस्तक्षेप करता है? मैं आवश्यक डेटा फ्रेम को सबसे अच्छी तरह से कैसे बनाऊंगा (जिसमें मूल फ्रेम की तुलना में अधिक पंक्तियों की आवश्यकता होगी ताकि शर्तों और एक्स, वाई जोड़े के सभी संयोजनों के लिए)।

उत्तर

10

व्यक्तिगत रूप से, मुझे लगता है कि डेटा फ्रेम बनाने और geom_ribbonका उपयोग सुरुचिपूर्ण समाधान है, लेकिन स्पष्ट रूप से राय उस स्कोर पर भिन्न होगी।

लेकिन आप plyr और ggplot का पूरा लाभ लेने अगर बातें बहुत चालाक हो सकता है। कि मैं उत्पन्न त्यागकर रहा हूँ

dat <- data.frame(cond1=c("a","a","b","b"), 
      cond2=c("c","d","c","d"), 
      x=c(1,5), 
      y=c(1,5), 
      sl=c(1,1.2,0.9,1.1), 
      int=c(0,0.1,0.1,0), 
      slopeU=c(1.1,1.3,1.2,1.2), 
      slopeL=c(.9,1,0.7,1)) 

genRibbon <- function(param,xrng){ 
    #xrng is a vector of min/max x vals in original data 
    r <- abs(diff(xrng)) 
    #adj for plot region expansion 
    x <- seq(xrng[1] - 0.05*r,xrng[2] + 0.05*r,length.out = 3) 
    #create data frame 
    res <- data.frame(cond1 = param$cond1, 
         cond2 = param$cond2, 
         x = x, 
         y = param$int + param$sl * x, 
         ymin = param$int + param$slopeL * x, 
         ymax = param$int + param$slopeU * x) 
    #Toss the min/max x vals just to be safe; needed them 
    # only to get the corresponding y vals 
    res$x[which.min(res$x)] <- -Inf 
    res$x[which.max(res$x)] <- Inf 
    #Return the correspondinng geom_ribbon 
    geom_ribbon(data = res,aes(x = x,y=y, ymin = ymin,ymax = ymax, 
           fill = cond1,colour = NULL), 
       alpha = 0.5) 
} 

ribs <- dlply(dat,.(cond1,cond2),genRibbon,xrng = c(1,5)) 

अतिरिक्त चालाक यहाँ बात है: के बाद से अपने ढलान और अवरोध सब अच्छी तरह से वैसे भी एक dataframe में जमा हो जाती है, हम सब काम करने के लिए plyr और एक कस्टम समारोह का उपयोग कर सकते डेटा फ्रेम पूरी तरह से और बस geom_ribbon वस्तुओं की एक सूची लौट रहा है। तब वे केवल हमारे साजिश में जोड़ा जा सकता:

p + ribs + 
    guides(fill = guide_legend(override.aes = list(alpha = 0.1))) 

मैं कथा में alpha सौंदर्य overrode क्योंकि आप पहली बार कथा में विकर्ण लाइनों नहीं देख सकता था।

enter image description here

मैं आपको चेतावनी देता हूँ कि वहाँ अंतिम पंक्ति है कि भूखंडों उत्पन्न करता भी अवैध कारक के स्तर के बारे में चेतावनी का एक बहुत फेंकता है, और मैं ईमानदारी से यकीन है कि क्यों नहीं कर रहा हूँ। लेकिन साजिश ठीक दिखती है।

+0

यह कमाल है; धन्यवाद जोरेन। – tsawallis

+0

तो यह मूल रूप से मेरी लागू समस्या के साथ काम करता है, लेकिन मुझे छायांकित क्षेत्रों पर रंगों को cond1 पर नहीं मिल सकता है, यहां तक ​​कि आपके समाधान को ठीक से चलाकर भी। भरे हुए रिबन क्षेत्र ग्रे होते हैं (अल्फा = .5 पर) लेकिन पतली ठोस रेखा सीमाएं भी होती हैं। मुझसे कहां गलती हो रही है? क्या यह एक ggplot2 संस्करण अंतर हो सकता है? मैं 0.9.0 पर हूँ। मैं जिस ggplot कमांड का उपयोग कर रहा हूं वह मूल पोस्ट में है, 'पी + पसलियों + गाइड (fill = guide_legend (override.aes ​​= list (अल्फा = 0.1)) के साथ) नीचे चिपकाया गया है। – tsawallis

+0

@ वाल्डोग क्षमा करें, कॉपी करें + मेरे कोड पेस्ट करते समय बस थोड़ा सा चूक गया।आपको 'एईएस()' में शीर्ष स्तर 'ggplot()' कॉल में, या फ़ंक्शन के अंदर 'geom_ribbon' कॉल' में 'fill = cond1'' जोड़ना होगा। मैं क्षणिक रूप से संपादित करूंगा ... – joran

संबंधित मुद्दे