The reproducible data below contains 50 observations for each animal (cat and dog) for each season (Summer and Winter) for two covariates (cov1 and cov2) and their respective error estimates (SE).
library(ggplot2); library(dplyr); library(tidyr)
set.seed(123)
dat <- data.frame(Season = rep(c("Summer", "Winter"), each = 100),
Species = rep(c("Dog", "Cat", "Dog", "Cat"), each = 50),
cov1 = sample(1:100, 200, replace = TRUE),
cov1SE = rnorm(200),
cov2 = sample(1:100, 200, replace = TRUE),
cov2SE = rnorm(200))
head(dat)
Season Species cov1 cov1SE cov2 cov2SE
1 Summer Dog 29 -0.71040656 24 -0.07355602
2 Summer Dog 79 0.25688371 69 -1.16865142
3 Summer Dog 41 -0.24669188 23 -0.63474826
4 Summer Dog 89 -0.34754260 32 -0.02884155
5 Summer Dog 95 -0.95161857 18 0.67069597
6 Summer Dog 5 -0.04502772 81 -1.65054654
Below I gather the data into long format for ggplot
EstLong <- dat %>% gather(Cov, Estimate, c(cov1, cov2))
SE <- dat %>% gather(Cov, SE, c(cov1SE, cov2SE))
datLong <- EstLong[ , c(1,2,5,6)]
datLong$SE <- SE[ , 6]
head(datLong)
Season Species Cov Estimate SE
1 Summer Dog cov1 29 -0.71040656
2 Summer Dog cov1 79 0.25688371
3 Summer Dog cov1 41 -0.24669188
4 Summer Dog cov1 89 -0.34754260
5 Summer Dog cov1 95 -0.95161857
6 Summer Dog cov1 5 -0.04502772
I am trying to plot all points and am using position_jitterdodge
to dodge and jitter the points (as suggested in this SO post), but cannot correctly align the error bars with the respective points as shown below. position_dodge
correctly aligns points and error bars, but jitter
is needed to reduce overlap along the x-axis. Any suggestions would be greatly appreciated.
Jit <- position_jitterdodge(dodge.width=0.4)
ggplot(datLong, aes(y = Estimate, x = Cov, color = Species)) +
geom_point(position = Jit, size = 1) +
geom_errorbar(aes(ymin = Estimate-SE, ymax = Estimate+SE), width = 0.2, position = Jit) +
theme_bw() +
facet_wrap(~ Season, ncol = 1, scales = "free") +
scale_color_manual(values = c("blue", "red"))
See Question&Answers more detail:
os