Skip to content

after_scale() does not work in Geom$default_aes fieldΒ #6135

@teunbrand

Description

@teunbrand

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().

missing_eval <- lapply(default_aes, eval_tidy)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions