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)
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?
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With