2010-07-02 10 views
13

position_jitter का उपयोग डेटा बिंदुओं को ओवरप्लॉट करने से रोकने के लिए यादृच्छिक जिटर बनाता है।क्या एक ही तरह से दो ggplot geoms jitter करना संभव है?

नीचे दिए गए मैंने अपनी समस्या को स्पष्ट करने के लिए बेसबॉल आंकड़ों का उदाहरण उपयोग किया है। जब मैं दो परतों के साथ एक ही डेटा प्लॉट करता हूं, वही जिटर कॉल भूगर्भों को थोड़ा अलग करता है। यह समझ में आता है क्योंकि यह दो कॉलों में स्वतंत्र रूप से यादृच्छिक जिटर उत्पन्न करता है, लेकिन नीचे दिए गए मेरे ग्राफ में आप जो समस्या देख सकते हैं उसे उत्पन्न करता है।

p=ggplot(baseball,aes(x=round(year,-1),y=sb,color=factor(lg))) 
p=p+stat_summary(fun.data="mean_cl_normal",position=position_jitter(width=3,height=0))+coord_cartesian(ylim=c(0,40)) 
p+stat_summary(fun.y=mean,geom="line",position=position_jitter(width=3,height=0)) 

हालांकि त्रुटि बार बिंदु और रेखा एक ही डेटा को संदर्भित करती है, वे अलग-अलग हैं- रेखाएं और बिंदु कनेक्ट नहीं होते हैं।

क्या इसके लिए कोई काम है? मैंने सोचा कि स्थिति चकमा जवाब हो सकता है लेकिन यह इस तरह के भूखंडों के साथ काम नहीं कर रहा है। वैकल्पिक रूप से, शायद लाइन_ जोड़ने के लिए mean_cl_normal कॉल प्राप्त करने का कोई तरीका है? alt text http://img339.imageshack.us/img339/1807/screenshot20100702at943.png

उत्तर

7

यह वर्तमान ggplot2 वाक्यविन्यास में एक कमजोरी है - अपने आप को जिटर जोड़ने के अलावा इसके आसपास काम करने का कोई तरीका नहीं है।

या आप कुछ इस तरह कर सकता है:

ggplot(baseball, aes(round(year,-1) + as.numeric(factor(lg)), sb, color = factor(lg))) + 
    stat_summary(fun.data="mean_cl_normal") + 
    stat_summary(fun.y=mean,geom="line") + 
    coord_cartesian(ylim=c(0,40)) 
+2

हैडली: क्या आपने इसका जवाब देने के बाद ggplot2 पर कोई अपडेट किया है? – gvrocha

8

मुझे ऐसा लगता है, बीज की स्थापना दो मामलों में एक ही हो द्वारा:

p=ggplot(baseball,aes(x=round(year,-1),y=sb,color=factor(lg))) 
myseed = 2010 
set.seed(myseed) 
p=p+stat_summary(fun.data="mean_cl_normal", 
    position=position_jitter(width=3,height=0))+coord_cartesian(ylim=c(0,40)) 
set.seed(myseed) 
p+stat_summary(fun.y=mean,geom="line", 
      position=position_jitter(width=3,height=0)) 

यह सुनिश्चित करता है कि यादृच्छिक संख्या जनरेटर एक ही प्रारंभिक स्थिति में वापस भेज दिया जाता है के रूप में इस्तेमाल किया गया था प्रारंभिक कॉल हालांकि मुझे नहीं पता कि आप मूल्यों में जोड़े गए यादृच्छिक वृद्धि कैसे निकाल सकते हैं।

+0

अच्छा विचार, लेकिन यह काम नहीं किया! मैंने सोचा कि यह काम करेगा, क्योंकि स्थिति_जिटर बेस पैकेज के जिटर का उपयोग करता है, जो मुझे उम्मीद है कि set.seed द्वारा बीजित उसी यादृच्छिक संख्या जेनरेटर का उपयोग किया जाएगा। मुझे लगता है कि एक्स का अपना खुद का उत्साही संस्करण बनाना एक सामान्य कामकाज होगा, लेकिन उम्मीद है कि एक बेहतर तरीका है। –

+1

यह काम नहीं करेगा क्योंकि साजिश के समय पर झटके का काम नहीं किया जाता है। – hadley

+0

यह मेरे लिए पूरी तरह से काम किया। होली ने टिप्पणी की थी (4 साल पहले) के बाद से शायद एक नए संस्करण के बारे में कुछ। जहां तक ​​मेरा संबंध है, यह नया जवाब होना चाहिए। – rcorty

1

मैं इस समस्या को हल करने के लिए एक समान वितरण पैदा करने समाप्त हो गया।

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

समस्या का मेरा डेमो और मेरा समाधान निम्नलिखित है। मैं इस साजिश के लिए ggplot का उपयोग नहीं करता, लेकिन वही अवधारणा लागू होती है। मैं एक समान वितरण करता हूं, प्रत्येक मूल्य के लिए एक मान जो मुझे जिटर की आवश्यकता है। मैं इसे स्रोत डेटाफ्रेम में जोड़ता हूं ताकि प्रत्येक बार जब मैं एक सबसेट लेता हूं, तो जिटर मान उसी मूल डेटा मान से मेल खाता है।

data(airquality) 
someDataset= airquality 
someDataset$color="black" 
someDataset$color[someDataset$Month==8 & someDataset$Wind==9.7]="red" 
## jitter gives different results each time it's run 
for (fZoom in c(TRUE, FALSE)){ 
    if (fZoom) myAirQuality = someDataset[someDataset $Wind >7.5 & someDataset $Wind < 11.5,] 
    else myAirQuality = someDataset[someDataset $Wind >8.5 & someDataset $Wind < 10.5,] 
    quartz("Using Jitter") 
    plot(myAirQuality $Wind ~ jitter(myAirQuality $Month), col= myAirQuality$color) 
    } 

someDataset$MonthJit=runif(nrow(someDataset), min=-0.2, max=0.2) 
for (fZoom in c(TRUE, FALSE)){ 
    if (fZoom) myAirQuality = someDataset[someDataset $Wind >7.5 & someDataset $Wind < 11.5,] 
    else myAirQuality = someDataset[someDataset $Wind >8.5 & someDataset $Wind < 10.5,] 
    quartz("Using runif") 
    plot(myAirQuality $Wind ~ c(myAirQuality $Month + myAirQuality $MonthJit), col= myAirQuality$color) 
    } 
संबंधित मुद्दे