Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add percentage or count labels above percentage bar plot?

Tags:

r

ggplot2

Using ggplot2 1.0.0, I followed the instructions in below post to figure out how to plot percentage bar plots across factors:

Sum percentages for each facet - respect "fill"

test <- data.frame(      test1 = sample(letters[1:2], 100, replace = TRUE),       test2 = sample(letters[3:8], 100, replace = TRUE)      ) library(ggplot2) library(scales) ggplot(test, aes(x= test2, group = test1)) +  geom_bar(aes(y = ..density.., fill = factor(..x..))) +  facet_grid(~test1) + scale_y_continuous(labels=percent) 

enter image description here

However, I cannot seem to get a label for either the total count or the percentage above each of the bar plots when using geom_text.

What is the correct addition to the above code that also preserves the percentage y-axis?

like image 334
alxlvt Avatar asked Apr 25 '15 19:04

alxlvt


People also ask

How do I add percentages to a barplot in R?

A better way to make the barplot is to add the percentage symbol on the y-axis instead of the fraction we have now. We can use scales package' percent method to add percentage symbol to the y-axis using scale_y_continuous() function.

Can you use percentages in a bar graph?

Bar charts are different from tables because you can only display one value for each bar (the height of the bar on the scale). You can represent counts and percentage values together in a table. For a bar chart, the height of the bar must be either the counts or the percentage.


1 Answers

Staying within ggplot, you might try

ggplot(test, aes(x= test2,  group=test1)) +    geom_bar(aes(y = ..density.., fill = factor(..x..))) +   geom_text(aes( label = format(100*..density.., digits=2, drop0trailing=TRUE),                  y= ..density.. ), stat= "bin", vjust = -.5) +   facet_grid(~test1) +   scale_y_continuous(labels=percent) 

For counts, change ..density.. to ..count.. in geom_bar and geom_text

UPDATE for ggplot 2.x

ggplot2 2.0 made many changes to ggplot including one that broke the original version of this code when it changed the default stat function used by geom_bar ggplot 2.0.0. Instead of calling stat_bin, as before, to bin the data, it now calls stat_count to count observations at each location. stat_count returns prop as the proportion of the counts at that location rather than density.

The code below has been modified to work with this new release of ggplot2. I've included two versions, both of which show the height of the bars as a percentage of counts. The first displays the proportion of the count above the bar as a percent while the second shows the count above the bar. I've also added labels for the y axis and legend.

  library(ggplot2)   library(scales) # # Displays bar heights as percents with percentages above bars #     ggplot(test, aes(x= test2,  group=test1)) +      geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +     geom_text(aes( label = scales::percent(..prop..),                    y= ..prop.. ), stat= "count", vjust = -.5) +     labs(y = "Percent", fill="test2") +     facet_grid(~test1) +     scale_y_continuous(labels=percent) # # Displays bar heights as percents with counts above bars #     ggplot(test, aes(x= test2,  group=test1)) +      geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +     geom_text(aes(label = ..count.., y= ..prop..), stat= "count", vjust = -.5) +     labs(y = "Percent", fill="test2") +     facet_grid(~test1) +     scale_y_continuous(labels=percent) 

The plot from the first version is shown below.

enter image description here

like image 53
WaltS Avatar answered Oct 05 '22 06:10

WaltS