2013-02-25 13 views
27

प्रत्येक X -value मैं हर वाई मूल्यआर में एक भूखंड पर मानक विचलन को दिखाने के लिए त्रुटि बार जोड़ें

x = 1:5 
y = c(1.1, 1.5, 2.9, 3.8, 5.2) 
sd = c(0.1, 0.3, 0.2, 0.2, 0.4) 

plot (x, y) 

मैं का उपयोग कैसे कर सकते हैं की औसत Y -value और मानक विचलन (sd) गणना के लिए मेरी साजिश के प्रत्येक डेटापॉइंट में त्रुटि बार जोड़ने के लिए मानक विचलन?

+0

भी 'देख plotrix :: plotCI' –

उत्तर

18

csgillespie समाधान के साथ एक समस्या दिखाई देता है, जब आप एक लघुगणक एक्स अक्ष की है। आपके पास बाईं ओर दाईं ओर छोटे सलाखों की एक अलग लंबाई होगी (ईपीएसलॉन एक्स-मानों का पालन करता है)।

बेहतर होगा कि तुम Hmisc पैकेज से errbar समारोह का उपयोग करना चाहिए:

d = data.frame(
    x = c(1:5) 
    , y = c(1.1, 1.5, 2.9, 3.8, 5.2) 
    , sd = c(0.2, 0.3, 0.2, 0.0, 0.4) 
) 

##install.packages("Hmisc", dependencies=T) 
library("Hmisc") 

# add error bars (without adjusting yrange) 
plot(d$x, d$y, type="n") 
with (
    data = d 
    , expr = errbar(x, y, y+sd, y-sd, add=T, pch=1, cap=.1) 
) 

# new plot (adjusts Yrange automatically) 
with (
    data = d 
    , expr = errbar(x, y, y+sd, y-sd, add=F, pch=1, cap=.015, log="x") 
) 
19

आप बेस ग्राफिक्स में बार जोड़ने के लिए segments का उपयोग कर सकते हैं। यहां epsilon लाइन के शीर्ष और नीचे की रेखा को नियंत्रित करता है।

plot (x, y, ylim=c(0, 6)) 
epsilon = 0.02 
for(i in 1:5) { 
    up = y[i] + sd[i] 
    low = y[i] - sd[i] 
    segments(x[i],low , x[i], up) 
    segments(x[i]-epsilon, up , x[i]+epsilon, up) 
    segments(x[i]-epsilon, low , x[i]+epsilon, low) 
} 

@thelatemail बताते हैं के रूप में, मैं वास्तव में इस्तेमाल किया जाना चाहिए था vectorised फ़ंक्शन को कॉल:

segments(x, y-sd,x, y+sd) 
epsilon = 0.02 
segments(x-epsilon,y-sd,x+epsilon,y-sd) 
segments(x-epsilon,y+sd,x+epsilon,y+sd) 

enter image description here

24

ggplot2 के साथ एक समाधान:

qplot(x,y)+geom_errorbar(aes(x=x, ymin=y-sd, ymax=y+sd), width=0.25) 

enter image description here

+0

सेटिंग geom_errorbar (चौड़ाई = 0) त्रुटि बार सिरों दोनों से कैप्स हटा देता है। त्रुटि बार के एक तरफ यह कैसे किया जा सकता है इसका कोई विचार? धन्यवाद – AJMA

18

@ csgillespie के जवाब के अलावा, segments भी बात की इस तरह के साथ मदद करने के लिए vectorised है:

plot (x, y, ylim=c(0,6)) 
segments(x,y-sd,x,y+sd) 
epsilon <- 0.02 
segments(x-epsilon,y-sd,x+epsilon,y-sd) 
segments(x-epsilon,y+sd,x+epsilon,y+sd) 

enter image description here

+0

मुझे अनुमान लगाया जाना चाहिए - धन्यवाद। – csgillespie

18

आप उपयोग कर सकते हैं arrows:

arrows(x,y-sd,x,y+sd, code=3, length=0.02, angle = 90) 
+1

यह उत्तर 'सेगमेंट' से जुड़े उत्तरों से बेहतर है; सरल, और तब भी काम करता है जब एक्स अक्ष लॉग स्केल पर होती है (जो बाएं बनाम बाईं ओर अलग-अलग लंबाई खींचने के लिए 'सेगमेंट' का उपयोग करके समाधान का कारण बनती है)। – bhaller

+0

@SmartCH, मैं एक मैट्रिक्स की पंक्ति से अंतराल की गणना कैसे करूं और फिर अंतराल की साजिश करूँगा और उपर्युक्त के रूप में, कृपया? –

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