Utilities for working with bidirectional layers
These functions are what underpins the ability of certain geoms to work
automatically in both directions. See the Extending ggplot2 vignette for
how they are used when implementing
has_flipped_aes( data, params = list(), main_is_orthogonal = NA, range_is_orthogonal = NA, group_has_equal = FALSE, ambiguous = FALSE, main_is_continuous = FALSE, main_is_optional = FALSE )
flip_data(data, flip = NULL)
flipped_names(flip = FALSE)
The layer data
The parameters of the
Geom. Only the
orientationparameter will be used.
yare present do they correspond to the main orientation or the reverse. E.g. If
yis present it is not flipped. If
NAthis check will be ignored.
ymaxis present do they correspond to the main orientation or reverse. If
NAthis check will be ignored.
Is it expected that grouped data has either a single
yvalue that will correspond to the orientation.
Is the layer ambiguous in its mapping by nature. If so, it will only be flipped if
params$orientation == "y"
If there is a discrete and continuous axis, does the continuous one correspond to the main orientation?
Is the main axis aesthetic optional and, if not given, set to
Logical. Is the layer flipped.
has_flipped_aes() is used to sniff out the orientation of the layer from
the data. It has a range of arguments that can be used to finetune the
sniffing based on what the data should look like.
flip_data() will switch
the column names of the data so that it looks like x-oriented data.
flipped_names() provides a named list of aesthetic names that corresponds
to the orientation of the layer.
TRUE if it detects a layer in the other
flip_data() will return the input
flip = FALSE and the data with flipped aesthetic names if
flip = TRUE.
flipped_names() returns a named list of strings. If
flip = FALSE the name of the element will correspond to the element, e.g.
flipped_names(FALSE)$x == "x" and if
flip = TRUE it will correspond to
the flipped name, e.g.
flipped_names(FALSE)$x == "y"
Controlling the sniffing
How the layer data should be interpreted depends on its specific features.
has_flipped_aes() contains a range of flags for defining what certain
features in the data correspond to:
main_is_orthogonal: This argument controls how the existence of only a
yaesthetic is understood. If
TRUEthen the exisiting aesthetic would be then secondary axis. This behaviour is present in
FALSEthen the exisiting aesthetic is the main axis as seen in e.g.
range_is_orthogonal: This argument controls whether the existance of range-like aesthetics (e.g.
xmax) represents the main or secondary axis. If
TRUEthen the range is given for the secondary axis as seen in e.g.
group_has_equal: This argument controls whether to test for equality of all
yvalues inside each group and set the main axis to the one where all is equal. This test is only performed if
TRUE, and only after less computationally heavy tests has come up empty handed. Examples are
ambiguous: This argument tells the function that the layer, while bidirectional, doesn't treat each axis differently. It will circumvent any data based guessing and only take hint from the
params. If this is not present it will fall back to
FALSE. Examples are
main_is_continuous: This argument controls how the test for discreteness in the scales should be interpreted. If
TRUEthen the main axis will be the one which is not discrete-like. Conversely, if
FALSEthe main axis will be the discrete-like one. Examples of
stat_bin(), while examples of
main_is_optional: This argument controls the rare case of layers were the main direction is an optional aesthetic. This is only seen in
xis set to
0if not given. If
TRUEthere will be a check for whether all
yare equal to