Here's an example from the ggplot2 homepage: http://had.co.nz/ggplot2/geom_errorbar.htmlhttps://ggplot2.tidyverse.org/reference/geom_errorbarh.html as others have mentioned in the comments, you have to calculate SE on your own and append this information to the data.frame
df <- data.frame( trt = factor(c(1, 1, 2, 2)), resp = c(1, 5, 3, 4), group = factor(c(1, 2, 1, 2)), se = c(0.1, 0.3, 0.3, 0.2) ) df2 <- df[c(1,3),] p <- ggplot(df, aes(fill=group, y=resp, x=trt)) p + geom_bar(position="dodge", stat="identity") dodge <- position_dodge(width=0.9) p + geom_bar(position=dodge, stat="identity") + geom_errorbar(aes(ymax = resp + se, ymin=resp - se), position=dodge, width=0.25) As a pointer, SE @ 95% CI usually looks something like this:
df$se <- 1.96*(sd(your_data, na.rm=T)/sqrt(your_n)) Your upper and lower CI bounds will just be df$se +/- the response (as shown in the aes() for geom_errorbar(), above)