reorder_within.Rd
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.
reorder_within(x, by, within, fun = mean, sep = "___", desc = FALSE, ...)
scale_x_reordered(..., sep = "___")
scale_y_reordered(..., sep = "___")
Function was forked from personal R package of David Robinson, "drlib": https://github.com/dgrtwo/drlib
Vector to reorder.
Vector of the same length, to use for reordering.
Vector of the same length that will later be used for faceting
Function to perform within each subset to determine the resulting ordering. By default, mean.
Separator to distinguish the two. You may want to set this manually if ___ can exist within one of your labels.
Set to TRUE if you wish to have the columns in descending order.
In reorder_within
arguments passed on to reorder
.
In the scale functions, extra arguments passed on to
scale_x_discrete
or scale_y_discrete
.
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")