New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved support for aesthetic aliases #2649

Closed
clauswilke opened this Issue May 22, 2018 · 4 comments

Comments

Projects
None yet
2 participants
@clauswilke
Member

clauswilke commented May 22, 2018

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:

ggplot2/R/aes.r

Lines 10 to 23 in eecc450

.base_to_ggplot <- c(
"col" = "colour",
"color" = "colour",
"pch" = "shape",
"cex" = "size",
"lty" = "linetype",
"lwd" = "size",
"srt" = "angle",
"adj" = "hjust",
"bg" = "fill",
"fg" = "colour",
"min" = "ymin",
"max" = "ymax"
)

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:

ggplot2/R/scale-.r

Lines 554 to 571 in eecc450

continuous_scale <- function(aesthetics, scale_name, palette, name = waiver(),
breaks = waiver(), minor_breaks = waiver(), labels = waiver(), limits = NULL,
rescaler = rescale, oob = censor, expand = waiver(), na.value = NA_real_,
trans = "identity", guide = "legend", position = "left", super = ScaleContinuous) {
check_breaks_labels(breaks, labels)
position <- match.arg(position, c("left", "right", "top", "bottom"))
if (is.null(breaks) && !is_position_aes(aesthetics) && guide != "none") {
guide <- "none"
}
trans <- as.trans(trans)
if (!is.null(limits)) {
limits <- trans$transform(limits)
}

and here:

ggplot2/R/scale-.r

Lines 620 to 632 in eecc450

discrete_scale <- function(aesthetics, scale_name, palette, name = waiver(),
breaks = waiver(), labels = waiver(), limits = NULL, expand = waiver(),
na.translate = TRUE, na.value = NA, drop = TRUE,
guide = "legend", position = "left", super = ScaleDiscrete) {
check_breaks_labels(breaks, labels)
position <- match.arg(position, c("left", "right", "top", "bottom"))
if (is.null(breaks) && !is_position_aes(aesthetics) && guide != "none") {
guide <- "none"
}

@clauswilke

This comment has been minimized.

Member

clauswilke commented Jul 7, 2018

@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

This comment has been minimized.

Member

clauswilke commented Jul 9, 2018

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:

ggplot2/R/aes.r

Lines 77 to 83 in c1908f1

aes <- function(x, y, ...) {
exprs <- rlang::enquos(x = x, y = y, ...)
is_missing <- vapply(exprs, rlang::quo_is_missing, logical(1))
aes <- new_aes(exprs[!is_missing], env = parent.frame())
rename_aes(aes)
}

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

This comment has been minimized.

Member

hadley commented Jul 9, 2018

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

@clauswilke

This comment has been minimized.

Member

clauswilke commented Jul 9, 2018

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.

clauswilke added a commit to clauswilke/ggplot2 that referenced this issue Jul 11, 2018

clauswilke added a commit that referenced this issue Jul 23, 2018

Rename aesthetics in scales and consistently convert US to British sp…
…elling (#2750)

* more consistent support of US spelling for colour aesthetics.

* update docs, add regression tests

* Add news item. Closes #2649

* remove spurious namespace prefix

* improved error message for duplicated aesthetics

* fix unit test
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment