ggplot2
ggplot2 copied to clipboard
`after_scale()` does not work in `Geom$default_aes` field
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