align points and error bars in ggplot when using `jitterdodge`
Asked Answered
H

1

2

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

enter image description here

Hopeh answered 16/6, 2017 at 18:37 Comment(3)
Related question here. Seems like it boils down to having to create your own jittering.Brachyuran
Thanks for the reference. Any thoughts on how to manually jitter within a grouping factor as a answer to the existing question?Hopeh
Manual jittering shown here. Look like jitter uses a uniform distribution, so you could always draw from a uniform on your own to create your new "jittered" variable.Brachyuran
A
6

You can extend the position_dodge to generate a fix jitter for the data:

myjit <- ggproto("fixJitter", PositionDodge,
                 width = 0.3,
                 dodge.width = 0.1,
                 jit = NULL,
                 compute_panel =  function (self, data, params, scales) 
                 {

                   #Generate Jitter if not yet
                   if(is.null(self$jit) ) {
                    self$jit <-jitter(rep(0, nrow(data)), amount=self$dodge.width)
                   }

                   data <- ggproto_parent(PositionDodge, self)$compute_panel(data, params, scales)

                   data$x <- data$x + self$jit
                   #For proper error extensions
                   if("xmin" %in% colnames(data)) data$xmin <- data$xmin + self$jit
                   if("xmax" %in% colnames(data)) data$xmax <- data$xmax + self$jit
                   data
                 } )




ggplot(datLong, aes(y = Estimate, x = Cov, color = Species, group=Species)) +
  geom_point(position = myjit, size = 1) +
  geom_errorbar(aes(ymin = Estimate-SE, ymax = Estimate+SE), width = 0.2, position = myjit)+
  theme_bw() +
  facet_wrap(~ Season, ncol = 1, scales = "free") +
  scale_color_manual(values = c("blue", "red"))

Note that you have to create a new object fixJitter for every plot.

Here is the plot:

Fixed Jitter

Algo answered 17/6, 2017 at 1:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.