In some situations we may want to rearrange factors based on the value of that factor. Examine the following dataset, and imagine that the group letter had no inherent meaning.
library(tidyverse) dats #> # A tibble: 6 x 2 #> group value #> <fct> <int> #> 1 A 20 #> 2 B 7 #> 3 C 12 #> 4 D 14 #> 5 E 22 #> 6 F 15
The issue with this is when we plot, the order of geoms on the x-axis follows this arbitrary order.
ggplot(dats, aes(x = group, y = value, fill = group)) + geom_col() + geom_text(aes(label = value, y = value - 3)) + coord_flip() + guides(fill = "none")
It can sometimes be far more useful to order elements in terms of their size. To do this, you can use the
fct_reorder() from the
dats_forcats = dats %>% arrange(desc(value)) %>% mutate(group = forcats::fct_reorder(group,value)) ggplot(dats_forcats, aes(x = group, y = value, fill = group)) + geom_col() + geom_text(aes(label = value, y = value - 3)) + coord_flip() + guides(fill = "none")
And there you have it. Of course, you may need to use
summarize or a similar function, possibly followed by a join,
if you have more complex or sophisticated criteria to arrange by. See also
??forcats::fct_reorder for more information, which shows how you can write a custom function for reordering.