Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot replace count with percentage in geom_bar

Tags:

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.

like image 998
Donbeo Avatar asked Jul 16 '14 08:07

Donbeo


People also ask

How do I get the Y-axis percentage in R?

Since we need to add percentages in the labels of the Y-axis, the keyword “labels” is used. Now use scales: : percent to convert the y-axis labels into a percentage. This will scale the y-axis data from decimal to percentage. It simply multiplies the value by 100.


1 Answers

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

like image 131
Jaap Avatar answered Sep 30 '22 05:09

Jaap