Adicione barras de erro para mostrar o desvio padrão em um gráfico em R

Para cada valor X , calculei o valor médio Y e o desvio padrão ( sd ) de cada valor Y

 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) 

Como posso usar o desvio padrão para adicionar barras de erro a cada ponto de dados da minha plotagem?

Um problema com a solução csgillespie aparece quando você tem um eixo X logarítmico. Você terá um comprimento diferente das barras pequenas à direita e à esquerda (o épsilon segue os valores x).

Você deve usar melhor a function Hmisc pacote Hmisc :

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

Uma solução com ggplot2 :

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

insira a descrição da imagem aqui

Além da resposta de @ csgillespie, segments também são vetorizados para ajudar com esse tipo de coisa:

 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) 

insira a descrição da imagem aqui

Você pode usar segments para adicionar as barras nos charts base. Aqui o epsilon controla a linha na parte superior e inferior da linha.

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

Como o @thelatemail aponta, eu realmente deveria ter usado chamadas de function vetorizadas:

 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) 

insira a descrição da imagem aqui

Você pode usar arrows :

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