tidyverse / ggplot2

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

Preserve `NA`s in discrete palettes #5949

Open teunbrand opened 2 weeks ago

teunbrand commented 2 weeks ago

This PR aims to fix #5929.

Briefly, there are 3 situations by which a value can become NA in a discrete scale.

  1. The data value is NA.
  2. The data value does not match the scale limits.
  3. The data value is mapped to NA because a palette value is NA.

Currently, we cannot distinguish between situation (2) and situation (3). This PR ensures that situation (1) and (2) are laundered through the na.translate/na.value mechanism, but (3) is not because we could assume (3) is intentional by users (see issue).

As a demo, notice that 'e' gets NA due to (3) and is subsequently removed, while 'r' gets na.value due to (2).

devtools::load_all("~/packages/ggplot2/")
#> ℹ Loading ggplot2

ggplot(mpg, aes(displ, hwy, colour = fl)) +
  geom_point() +
  scale_colour_manual(
    values = c("tomato", "dodgerblue", NA, "limegreen"),
    limits = function(x) setdiff(x, "r"),
    na.value = "black"
  )
#> Warning: Removed 8 rows containing missing values or values outside the scale range
#> (`geom_point()`).

Created on 2024-06-19 with reprex v2.1.0