Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Could the scale_*_steps* functions support applying the full range of colour provided? #6068

Open
davidhodge931 opened this issue Aug 31, 2024 · 3 comments · May be fixed by #6112
Open

Could the scale_*_steps* functions support applying the full range of colour provided? #6068

davidhodge931 opened this issue Aug 31, 2024 · 3 comments · May be fixed by #6112

Comments

@davidhodge931
Copy link

davidhodge931 commented Aug 31, 2024

The scale_*_steps* functions currently do not apply the full range of colours to a plot.

See example below of scale_colour_binned, which applies the full range of the viridis colour palette compared to adding viridis colours to scale_colour_stepsn which does not.

Generally, you need as big a range of colour as possible when colouring a numeric variable.

Could the scale_*_steps* functions apply the full range of colour by default to the plot?

library(tidyverse)
library(palmerpenguins)
library(patchwork)

p1 <- penguins |>
  ggplot() +
  geom_point(aes(x = flipper_length_mm, y = body_mass_g, col = flipper_length_mm, )) +
  scale_colour_binned(type = "viridis") +
  labs(title = "binned")

p2 <- penguins |>
  ggplot() +
  geom_point(aes(x = flipper_length_mm, y = body_mass_g, col = flipper_length_mm, )) +
  scale_colour_stepsn(colours = viridis::viridis(9)) +
  labs(title = "stepsn")

p1 + p2
#> Warning: Removed 2 rows containing missing values or values outside the scale range
#> (`geom_point()`).
#> Removed 2 rows containing missing values or values outside the scale range
#> (`geom_point()`).

Created on 2024-09-01 with reprex v2.1.1

@teunbrand
Copy link
Collaborator

I've seen some SO posts around this, and I think having the option to do this is probably a good idea.
I don't think we should make it a default for backward compatibility reasons though.

@teunbrand
Copy link
Collaborator

OK this is more nuanced than I originally thought. Essentially:

  • the scale_colour_binned() plot is a discrete palette slapped onto a binned scale, where we increment the requested colour every bin.
  • the scale_colour_stepsn() is a continuous scale slapped onto a binned scale where the bin midpoints are translated to colours.

The difference becomes much clearer when you have enevenly distributed breaks:

library(ggplot2)
library(patchwork)

p <- ggplot(mpg, aes(displ, hwy, colour = cty)) +
  geom_point()

breaks <- c(8, 10, 12, 16, 20, 24)

p1 <- p +
  scale_colour_binned(type = "viridis", breaks = breaks) +
  labs(title = "binned")

p2 <- p +
  scale_colour_stepsn(colours = viridis::viridis(9), breaks = breaks) +
  labs(title = "stepsn")

p1 + p2

Created on 2024-09-16 with reprex v2.1.1

In order to take the 'full range' of the continuous scale, one shouldn't rescale the values using the limits, but the most extreme breaks. Unfortunately, the plumbing isn't setup to deal with this, so it is harder to do than anticipated.

@davidhodge931
Copy link
Author

davidhodge931 commented Sep 16, 2024

Ah, I see - thanks for the explanation.

I think it is a valid and common use-case to want to colour bins of your own custom colours and apply that colour palette in a discrete way like scale_colour_binned does.

Feel free to close

@teunbrand teunbrand linked a pull request Sep 17, 2024 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants