tidyverse / ggplot2

An implementation of the Grammar of Graphics in R
https://ggplot2.tidyverse.org
Other
6.39k stars 2k forks source link

Could support the use of function factories like `scales::pal_hue()` and `scales::pal_viridis()`? #5843

Open davidhodge931 opened 2 months ago

davidhodge931 commented 2 months ago

It'd be great if it was possible to do this for all of the non-positional scales, especially colour/fill

library(tidyverse)
library(palmerpenguins)

penguins |>
  ggplot() +
  geom_point(aes(x = flipper_length_mm,
                 y = body_mass_g,
                 col = species)) +
  scale_colour_manual(values = scales::pal_hue())

penguins |>
  ggplot() +
  geom_point(aes(x = flipper_length_mm,
                 y = body_mass_g,
                 col = bill_depth_mm)) +
  scale_colour_gradientn(colours = scales::pal_viridis())

penguins |>
  ggplot() +
  geom_point(aes(x = flipper_length_mm,
                 y = body_mass_g,
                 col = bill_depth_mm)) +
  scale_colour_stepsn(colours = scales::pal_viridis())
teunbrand commented 2 months ago

This has been on my mind as well to make the interface between scales and palettes somewhat smoother. Your first example can be replaced with discrete_scale("colour", palette = scales::pal_hue()), but this is not so much the case for the continuous examples.

For this to happen, I think {scales} needs to start describing palette functions more so that some properties are easily queried. Useful properties to know about palettes are:

If we know this, we can automatically expand discrete palettes to continuous ones by using e.g. colour_ramp(discrete_pal()(n_max)), or discretise continuous palettes by using continuous_pal()(seq(0, 1, length.out = n).