-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Closed
Labels
Description
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()
.
Line 139 in ddd207e
missing_eval <- lapply(default_aes, eval_tidy) |
yjunechoe and EvaMaeRey