Search code examples
rggplot2geom-bar

ggplot replace count with percentage in geom_bar


I have a dataframe d:

> head(d,20)
   groupchange Symscore3
1            4         1
2            4         2
3            4         1
4            4         2
5            5         0
6            5         0
7            5         0
8            4         0
9            2         2
10           5         0
11           5         0
12           5         1
13           5         0
14           4         1
15           5         1
16           1         0
17           4         0
18           1         1
19           5         0
20           4         0

That I am plotting with:

ggplot(d, aes(groupchange, y=..count../sum(..count..),  fill=Symscore3)) +
  geom_bar(position = "dodge") 

In this way each bar represents its percentage on the whole data.

Instead I would like that each bar represents a relative percentage; i.e. the sum of the bar in obtained with groupchange = k should be 1.


Solution

  • First summarise and transform your data:

    library(dplyr)
    d2 <- d %>% 
      group_by(groupchange, Symscore3) %>% 
      summarise(count = n()) %>% 
      mutate(perc = count/sum(count))
    

    Then you can plot it:

    ggplot(d2, aes(x = factor(groupchange), y = perc*100, fill = factor(Symscore3))) +
      geom_bar(stat="identity", width = 0.7) +
      labs(x = "Groupchange", y = "percent", fill = "Symscore") +
      theme_minimal(base_size = 14)
    

    this gives:

    enter image description here


    Alternatively, you can use the percent function from the scales package:

    brks <- c(0, 0.25, 0.5, 0.75, 1)
    
    ggplot(d2, aes(x = factor(groupchange), y = perc, fill = factor(Symscore3))) +
      geom_bar(stat="identity", width = 0.7) +
      scale_y_continuous(breaks = brks, labels = scales::percent(brks)) +
      labs(x = "Groupchange", y = NULL, fill = "Symscore") +
      theme_minimal(base_size = 14)
    

    which gives:

    enter image description here