tidyverse / ggplot2

An implementation of the Grammar of Graphics in R
https://ggplot2.tidyverse.org
Other
6.51k stars 2.03k forks source link

Improved support for aesthetic aliases #2649

Closed clauswilke closed 6 years ago

clauswilke commented 6 years ago

The current ggplot2 has support for aesthetic aliases, such as color instead of colour. However, there are two places where this support could be improved, and they should be tackled at the same time, I think.

1. Make aliases configurable

Currently the available aliases are hardcoded here: https://github.com/tidyverse/ggplot2/blob/eecc450f7f13c5144069705ef22feefe0b8f53f7/R/aes.r#L10-L23 I suspect most users are not even aware of some of those, e.g. "srt" = "angle". More importantly, it is currently not possible to create new aliases. So, if a package creates a new aesthetic, e.g. point_colour, it cannot create an alias point_color. The solution would be to provide functions that can add (and subtract?) aliases to (from) the default list. I would like to point out that this is conceptually similar to #2540 (user-defined theme elements), and similar techniques and user interfaces could be used in both cases.

2. Apply aliases to scales as well

Aliases are not applied to aesthetics arguments of scales. This leads to confusing behavior such as the following:

library(ggplot2)
# works
ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
  geom_point() +
  scale_color_viridis_d(aesthetics = "colour")


# does not work
ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
  geom_point() +
  scale_color_viridis_d(aesthetics = "color")

Created on 2018-05-21 by the reprex package (v0.2.0).

The solution is to rename aesthetics in the scales, just as it is done in the layers. There are only two places where this needs to happen, here: https://github.com/tidyverse/ggplot2/blob/eecc450f7f13c5144069705ef22feefe0b8f53f7/R/scale-.r#L554-L571 and here: https://github.com/tidyverse/ggplot2/blob/eecc450f7f13c5144069705ef22feefe0b8f53f7/R/scale-.r#L620-L632

clauswilke commented 6 years ago

@hadley expressed concern about user-modifiable aesthetics. I can see how that could be an issue, if e.g. point_color is sometimes converted into point_colour and sometimes not, depending on which package is loaded.

An alternative approach might be to simply define a much larger set of aesthetic aliases in ggplot2. Real problems (such as #2674) arise only from the British/US spelling of color/colour, so all we'd have to do is define variants of colour, e.g. point_colour, line_colour, frame_colour, and maybe colour1, colour2, colour3. We would not have to do the same for fill, size, shape, etc. A second advantage of this approach is that it would steer package developers towards a unified set of aesthetics names.

clauswilke commented 6 years ago

Two more possibilities, brought up here:

  1. Make it possible to specify aesthetics in themes
  2. Make it possible to specify aesthetics in layers

Regardless of other pros and cons of these options, I think they both suffer from the same technical problem: Aesthetics are renamed in the aes() function: https://github.com/tidyverse/ggplot2/blob/c1908f192db6f5b5937f38ae1f2fc0410e4be7d5/R/aes.r#L77-L83 and aes() is usually called early in plot construction, before themes or layers are defined. So it's not clear how aesthetic definitions in the theme or layer could be made available to aes() in, e.g., the ggplot() call.

hadley commented 6 years ago

Does renaming matter though? I think it’s important for historical reasons, but I don’t think it’s needed for new aesthetics.

clauswilke commented 6 years ago

It's all about the color/colour spelling differences. Currently color will be renamed to colour internally, but point_color will not be renamed to point_colour. No other nonstandard aesthetics need any support that isn't there yet. E.g., I can use point_size today without any problems.

On further reflection, maybe the right solution is to just use a regular expression and replace any substring color in the name of an aesthetic with colour.

lock[bot] commented 5 years ago

This old issue has been automatically locked. If you believe you have found a related problem, please file a new issue (with reprex) and link to this issue. https://reprex.tidyverse.org/