ggplot2 icon indicating copy to clipboard operation
ggplot2 copied to clipboard

`geom_ribbon`: aesthetics can not vary with a ribbon

Open markjrieke opened this issue 4 years ago • 4 comments

Hi! I ran across the error in the title when mapping alpha to an aesthetic in geom_ribbon. ggplot2 is a mature package, so I suspect there are well-founded reasons this isn't supported, but on the off-chance, is this something that can be considered in the future?

In my use case, I was mapping confidence interval around an estimate to geom_ribbon, and wanted to have it "fade out" as it projected beyond the current date. Here's a toy reprex with the error:

library(tidyverse)

pi <- 3.1415926

tibble(x = seq(0, 2 * pi, length.out = 100)) %>%
  mutate(estimate = sin(x),
         ci_hi = estimate + 0.1,
         ci_lo = estimate - 0.1,
         
         # decrease alpha from pi -> 2*pi
         alpha = if_else(x >= pi, 0.25 * (1 - (x - pi)/pi), 0.25)) %>%
  ggplot(aes(x = x,
             y = estimate,
             ymin = ci_lo,
             ymax = ci_hi)) + 
  geom_line() +
  geom_ribbon(aes(alpha = alpha))
#> Error: Aesthetics can not vary with a ribbon

Created on 2021-12-07 by the reprex package (v2.0.1)

markjrieke avatar Dec 07 '21 16:12 markjrieke

Yes, this has not been possible due to limitations with the R graphics devices. With the latest improvements, this may now be possible, though probably not trivial. It's a reasonable request though.

clauswilke avatar Dec 07 '21 18:12 clauswilke

Related: #3997

clauswilke avatar Dec 07 '21 18:12 clauswilke

The way the new grid features have been implemented means that it is non-trivial to map aesthetics to e.g. gradients so it is something that will take quite some work to get right... but hopefully someday

thomasp85 avatar Dec 08 '21 07:12 thomasp85

A related feature has been implemented in ggdist: https://mjskay.github.io/ggdist/articles/slabinterval.html#gradient-plots-1

The relevant code is here: https://github.com/mjskay/ggdist/blob/d660a34bb58aaca44c0c12ab35b472ca222ee9fe/R/geom_slabinterval.R#L792-L818

It doesn't seem too complicated, at least for gradients in one dimension. The problem for the feature requested here is that it will require a 2d gradient (alpha value depends on x and y position), but I believe that's in principle possible also.

clauswilke avatar Dec 08 '21 16:12 clauswilke