ggplot2 icon indicating copy to clipboard operation
ggplot2 copied to clipboard

`after_scale()` does not work in `Geom$default_aes` field

Open teunbrand opened this issue 1 year ago • 1 comments

This was brought to my attention by @larmarange.

Hypothetically, one could want to automate making the following plot, by setting the default colour aesthetic in the geom.

library(ggplot2)

ggplot(mpg, aes(displ, hwy, fill = drv)) +
  geom_point(aes(colour = after_scale(alpha(fill, 0.4))))

To do so, it does not seem unreasonable to make colour = after_scale(alpha(fill, 0.4)) part of the Geom$default_aes field.

GeomPointAlt <- ggproto(
  "GeomPointAlt", GeomPoint,
  default_aes = aes(
    colour = after_scale(alpha(fill, 0.4)),
    # Merge with default, removing pre-existing `colour`
    !!!modifyList(GeomPoint$default_aes, list(colour = NULL))
  )
)

However, that doesn't work because default aesthetics are evaluated in isolation, not in context of the data. For that reason, the fill aesthetic cannot be found.

ggplot(mpg, aes(displ, hwy, fill = drv)) +
  stat_identity(geom = GeomPointAlt)
#> Warning: Failed to apply `after_scale()` modifications to legend
#> Caused by error:
#> ! object 'fill' not found
#> Error: object 'fill' not found

Created on 2024-10-11 with reprex v2.1.1

The relevant line is indicated below, and I think we only need to add a data = data to the lapply().

https://github.com/tidyverse/ggplot2/blob/ddd207e926cc1c1847dc661d9a099b8ec19c4010/R/geom-.R#L139

teunbrand avatar Oct 11 '24 17:10 teunbrand