reorder_within {tidytext} | R Documentation |
Reorder an x or y axis within facets
Description
Reorder a column before plotting with faceting, such that the values are
ordered within each facet. This requires two functions: reorder_within
applied to the column, then either scale_x_reordered
or
scale_y_reordered
added to the plot.
This is implemented as a bit of a hack: it appends ___ and then the facet
at the end of each string.
Usage
reorder_within(x, by, within, fun = mean, sep = "___", ...)
scale_x_reordered(..., labels = reorder_func, sep = deprecated())
scale_y_reordered(..., labels = reorder_func, sep = deprecated())
reorder_func(x, sep = "___")
Arguments
x |
Vector to reorder. |
by |
Vector of the same length, to use for reordering. |
within |
Vector or list of vectors of the same length that will later be used for faceting. A list of vectors will be used to facet within multiple variables. |
fun |
Function to perform within each subset to determine the resulting ordering. By default, mean. |
sep |
Separator to distinguish |
... |
In |
labels |
Function to transform the labels of
|
Source
"Ordering categories within ggplot2 Facets" by Tyler Rinker: https://trinkerrstuff.wordpress.com/2016/12/23/ordering-categories-within-ggplot2-facets/
Examples
library(tidyr)
library(ggplot2)
iris_gathered <- gather(iris, metric, value, -Species)
# reordering doesn't work within each facet (see Sepal.Width):
ggplot(iris_gathered, aes(reorder(Species, value), value)) +
geom_boxplot() +
facet_wrap(~ metric)
# reorder_within and scale_x_reordered work.
# (Note that you need to set scales = "free_x" in the facet)
ggplot(iris_gathered, aes(reorder_within(Species, value, metric), value)) +
geom_boxplot() +
scale_x_reordered() +
facet_wrap(~ metric, scales = "free_x")
# to reorder within multiple variables, set within to the list of
# facet variables.
ggplot(mtcars, aes(reorder_within(carb, mpg, list(vs, am)), mpg)) +
geom_boxplot() +
scale_x_reordered() +
facet_wrap(vs ~ am, scales = "free_x")