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

时光怂恿深爱的人放手 提交于 2019-11-28 10:31:11

问题


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


回答1:


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:



来源:https://stackoverflow.com/questions/44595920/align-points-and-error-bars-in-ggplot-when-using-jitterdodge

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!