Search code examples
rggplot2position-dodge

R ggplot: How to align points with dodged bars?


I'd like to know how to align geom_point points with the geom_bar dodged bars positions.

The bars are dodged according to the Year parameter but the points all plot in the middle of the dodged bars regardless of their Year parameter.

enter image description here

Reproducible code:

set.seed(42)
dat <- data.frame(Response = rep(paste0("Response",1:4),2),
                  Proportion = round(runif(8),2),
                  Year = c(rep(2017,4),rep(2018,4)))
industries <- data.frame(Response = rep(paste0("Response",1:4),6),
                         Proportion = round(runif(24),2),
                         Year = rep(c(rep(2017,4),rep(2018,4)),3),
                         Cat = rep(paste0("Cat",1:3),c(rep(8,3))))
ggplot(dat, aes(Response, Proportion, label = paste0(Proportion*100,"%"), fill = factor(Year))) + 
  geom_bar(stat = "identity", position = "dodge" ) + 
  geom_point(data = industries, aes(Response, Proportion, fill = factor(Year), col= Cat), size = 3) +
  theme(axis.text.x = element_text(angle = 90)) + 
  scale_y_continuous(labels = scales::percent) + 
  geom_text(position = position_dodge(width = 1), angle = 90)

Solution

  • You'd need group = factor(Year) in aes(), then position = position_dodge(1) (as suggested by @Tung). Also repeating x, y in aes() for geom_point() is superfluous:

    ggplot(dat, aes(Response, Proportion, label = paste0(Proportion*100,"%"), 
                    fill = factor(Year))) + 
      geom_bar(stat = "identity", position = "dodge" ) + 
      geom_point(data = industries, aes(col= Cat, group = factor(Year)), size = 3,
                 position = position_dodge(1)) +
      theme(axis.text.x = element_text(angle = 90)) + 
      scale_y_continuous(labels = scales::percent) + 
      geom_text(position = position_dodge(width = 1), angle = 90)
    

    enter image description here