I'm creating a stacked bar chart using ggplot like this:
plot_df <- df[!is.na(df$levels), ] ggplot(plot_df, aes(group)) + geom_bar(aes(fill = levels), position = "fill")
Which gives me something like this:
How do I reverse the order the stacked bars themselves, so that level 1 is at the bottom, and level 5 is at the top of each bar?
I've seen a number of questions on this (e.g. How to control ordering of stacked bar chart using identity on ggplot2) and the common solution seems to be to reorder the dataframe by that level as that what ggplot is using the determine the order
So I've tried reordering using dplyr:
plot_df <- df[!is.na(df$levels), ] %>% arrange(desc(levels))
However, the plot comes out the same. It also doesn't seem to make a difference whether I arrange by ascending or descending order
Here is a reproducible example:
group <- c(1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4) levels <- c("1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4","5","5","5","5","1","1","1","1") plot_df <- data.frame(group, levels) ggplot(plot_df, aes(group)) + geom_bar(aes(fill = levels), position = "fill")
On the Format tab, in the Current Selection group, click Format Selection. In the Axis Options category, do one of the following: For categories, select the Categories in reverse order check box. For values, select the Values in reverse order check box.
Right-click any series on the chart. In the "Format Data Series" dialog, there is a "Series Order" tab, in which you can move series up and down.
The release notes of ggplot2
version 2.2.0 on Stacking bars suggest:
If you want to stack in the opposite order, try
forcats::fct_rev()
library(ggplot2) # version 2.2.1 used plot_df <- data.frame(group = rep(1:4, 6), levels = factor(c(rep(1:5, each = 4), rep(1, 4)))) ggplot(plot_df, aes(group, fill = forcats::fct_rev(levels))) + geom_bar(position = "fill")
This is the original plot:
ggplot(plot_df, aes(group, fill = levels)) + geom_bar(position = "fill")
Or, using position_fill(reverse = TRUE)
as suggested by alistaire in his comment:
ggplot(plot_df, aes(group, fill = levels)) + geom_bar(position = position_fill(reverse = TRUE))
Note that the levels (colors) in the legend is not in the same order as in the stacked bars.
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