2013-03-18 11 views
14

मैं एक बिंदु सीमा साजिश बनाना चाहता हूं जहां समूहों के बिंदु एक-दूसरे पर नहीं खड़े होते हैं। enter image description here: भूखंड इस तरह दिखना चाहिएदो स्तरों पर पॉइंट्रेंज ggplots कैसे चकमा?

मेरे सबसे अच्छे चकमा दे रहा करने के लिए प्रयास चकमा बहस में एक सदिश का उपयोग करना है:

library(ggplot2) 

dat <- structure(list(Treatment = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    Temp = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 
    2L, 2L), .Label = c("10", "20"), class = "factor"), Rep = c(1L, 
    2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), Meas = c(3L, 
    2L, 2L, 2L, 6L, 4L, 4L, 3L, 5L, 1L, 2L, 3L), SD = c(2L, 3L, 
    2L, 2L, 2L, 3L, 2L, 3L, 3L, 3L, 2L, 1L)), .Names = c("Treatment", 
"Temp", "Rep", "Meas", "SD"), row.names = c(NA, -12L), class = "data.frame") 

ggplot(dat, aes(x = Treatment, y = Meas, ymin = Meas - SD/2, ymax = Meas + SD/2)) + 
geom_linerange(aes(color = Temp), position=position_dodge(width=c(0.6,0.4)), size = 1, alpha = 0.5) + 
geom_point(aes(color = Temp, shape = Temp), position=position_dodge(width=c(0.6,0.4)), size = 3) + 
theme_bw() 

कौन सा एक साजिश नीचे दिखाया गया है की ओर जाता है। हालांकि, सभी बिंदुओं को डोड नहीं किया गया है और मुझे प्लॉट शो प्राप्त करने के लिए इलस्ट्रेटर में डॉट्स और एरर बार को स्थानांतरित करना होगा। क्या ggplot2 में दो स्तरों पर डॉज तर्क का उपयोग करने का कोई तरीका है? enter image description here

+5

+1! क्यों यहाँ downvote !! – agstudy

+1

दिलचस्प सवाल, आपको ग्रुपिंग वैरिएबल के रूप में 'रेप' निर्दिष्ट करके थोड़ा बेहतर परिणाम मिलते हैं, 'ggplot (डेटा, एईएस (एक्स = ट्रीटमेंट, वाई = मीस, वाईमिन = मीस - एसडी/2, वाईमैक्स = मीस + एसडी/2, समूह = प्रतिनिधि)) ', लेकिन अभी भी काफी अनुकूल नहीं है। इसके अलावा आप 'geom_pointrange' का उपयोग करके कॉल को सरल बना सकते हैं, उदा। 'geom_pointrange (एईएस (रंग = टेम्प, आकार = टेम्प), स्थिति = position_dodge (चौड़ाई = सी (0.6,0.4)), आकार = 1, अल्फा = 0.7)'। –

उत्तर

5

तर्कसंगत सोचते हुए, position_dodge बार के लिए अधिक उपयुक्त है। यह एक कारक स्तर पर lineranges के साथ काम करता है, हालांकि दूसरे स्तर पर लाइनों के बीच न्यूनतम दूरी को परिभाषित करना मुश्किल है। हालांकि आप कारकों के बीच संख्यात्मक भेद कर सकते हैं और फिर लेबल के लिए उचित स्थिति जोड़ सकते हैं।

dat1<-cbind(dat,aux=rep(1,length(dat[,1]))) 
dat1<-within(dat1, {aux = unlist(by(aux,Treatment,cumsum))}) 
dat1$aux<-dat1$aux+as.numeric(dat1$Treatment)*10 
ggplot(dat1, aes(x=aux, y = Meas, ymin = Meas - SD/2, ymax = Meas + SD/2)) + 
geom_linerange(aes(color = Temp), size = 1, alpha = 0.5) +geom_point(aes(color = Temp, shape = Temp))+ 
scale_x_continuous("Treatment",breaks=c(13.5,23.5), labels=c("A","B")) + # here you define coordinates for A and B 
theme_bw() 

enter image description here

+0

मुझे लगता है, आप 'lineranges' के लिए' position_dodge' का भी उपयोग कर सकते हैं। मुद्दा यह है कि यह 'उपचार' द्वारा मूल्यों ('रंगीन' द्वारा समूहीकृत) को चकित करेगा और ओपी को उसमें भी चकमा चाहिए। यही है, अगर 'Temp = 10' और' Temp = 20' के लिए प्रत्येक केवल 1 मान था, तो 'डॉज' ठीक काम करेगा। – Arun

+0

कारक 'टेम्प' के लिए डॉज का उपयोग करने में कोई समस्या नहीं है। समस्या यह है कि सभी 'lineranges' एक साथ विलय कर रहे हैं। इसे रोकने के लिए मैंने प्रत्येक अवलोकन के लिए अलग-अलग कारक का उपयोग किया। जब हम कारक 'उपचार' पर चकमा डाल रहे हैं तो हम दोनों तरफ ए और बी के एक्स समन्वय के अनुसार कुछ अंतर निर्धारित करते हैं। प्रत्येक पंक्ति में सटीक एक्स समन्वय भी होता है, हालांकि आप दूसरे कारक पर चकमा नहीं दे सकते हैं, यहां तक ​​कि प्रत्येक पंक्ति के लिए अलग-अलग कारक के साथ समूहिंग भी नहीं करते हैं। – user974514

+0

हाँ, मुझे वह मिलता है। मैं बस अपनी पहली और दूसरी लाइनों के बारे में लिख रहा था। – Arun

2

यह position_dodge() के साथ समस्या का समाधान नहीं करेगा, लेकिन इस समस्या के लिए कामकाज होगा।

आपके मूल डेटा फ्रेम में नया चर x जोड़ा गया। इसमें अंक/लिनेरेंज के लिए x निर्देशांक शामिल हैं। डेटा फ्रेम में मानों को क्रमशः आप प्लॉट करना चाहते हैं।

dat$x<-c(0.85,0.9,0.95,1.05,1.1,1.15,1.85,1.9,1.95,2.05,2.1,2.15) 

अब पैमाने पर A और B पाने के लिए x मूल्यों के रूप में और scale_x_continuos() सेट टूट जाता है और लेबल के साथ इस नए चर का उपयोग करें।

ggplot(dat, aes(x = x, y = Meas, ymin = Meas - SD/2, ymax = Meas + SD/2)) + 
    geom_linerange(aes(color = Temp), size = 1, alpha = 0.5) + 
    geom_point(aes(color = Temp, shape = Temp), size = 3) + 
    theme_bw()+ 
    scale_x_continuous("Treatment",breaks=c(1,2),labels=c("A","B"),limits=c(0.5,2.5)) 
संबंधित मुद्दे