Search code examples
ggplot2geom-bargeom-text

double geom_bar, how to get the values for each bar


I have a ggplot of countries (X axis) over two different time periods (Y axis), so double bar for each country. I would like to see the values of each bar. I used geom_text but I get the values on the same line so they are not in place. How can I use geom_text for this type of plot ?

Rcountry %>%
  gather("Type", "Value",-Country) %>%
  ggplot(aes(Country, Value, fill = Type)) +
  geom_bar(position = "dodge", stat = "identity") + 
  coord_flip()+
  theme_minimal()+scale_fill_grey()+
  theme(legend.position="bottom")+
  theme(legend.title = element_blank())+
  scale_fill_manual(values=c("darkslategray4", "darkslategrey"))+
  labs(x="Country", y="Stock of robots per thousands worker in '000")+
  geom_text(aes(label=c(X2010, X2018)), size=3.5)```

Thank you


Solution

  • This can be achieved by adding position = position_dodge(.9) to geom_text, i.e. you have to the positioning used in geom_bar to geom_text to get the labels right. Using mtcars as example data, try this:

    library(ggplot2)
    library(dplyr)
    
    mtcars2 <- mtcars %>% 
      group_by(cyl, gear) %>% 
      summarise(mpg = mean(mpg)) %>% 
      ungroup()
    
    ggplot(mtcars2, aes(x = factor(cyl), mpg, fill = factor(gear))) + 
      geom_bar(position = "dodge", stat = "identity") +
      theme_minimal() + 
      scale_fill_grey() +
      theme(legend.position="bottom")+
      theme(legend.title = element_blank())+
      labs(x="Country", y="Stock of robots per thousands worker in '000")+
      geom_text(aes(label = mpg), position = position_dodge(.9), size=3.5) +
      coord_flip()
    

    Created on 2020-04-15 by the reprex package (v0.3.0)