Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
640 views
in Technique[技术] by (71.8m points)

r - align points and error bars in ggplot when using `jitterdodge`

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...