diff --git a/NEWS.md b/NEWS.md index 4a5398a300..9364b75a31 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,11 @@ # ggplot2 (development version) +* `scale_*_manual()` no longer displays extra legend keys, or changes their + order, when a named `values` argument has more items than the data. To display + all `values` on the legend instead, use + `scale_*_manual(values = vals, limits = names(vals))`. (@teunbrand, @banfai, + #4511, #4534) + # ggplot2 3.3.5 This is a very small release focusing on fixing a couple of untenable issues that surfaced with the 3.3.4 release diff --git a/R/scale-manual.r b/R/scale-manual.r index 6e408e4c12..28d35dc57b 100644 --- a/R/scale-manual.r +++ b/R/scale-manual.r @@ -132,8 +132,9 @@ manual_scale <- function(aesthetic, values = NULL, breaks = waiver(), ..., limit force(values) } - if (is.null(limits)) { - limits <- names(values) + if (is.null(limits) && !is.null(names(values))) { + # Limits as function to access `values` names later on (#4619) + limits <- function(x) intersect(x, names(values)) } # order values according to breaks diff --git a/tests/testthat/test-scale-manual.r b/tests/testthat/test-scale-manual.r index d33fe17da8..9355558893 100644 --- a/tests/testthat/test-scale-manual.r +++ b/tests/testthat/test-scale-manual.r @@ -117,7 +117,7 @@ test_that("fewer values (#3451)", { test_that("limits and breaks (#4619)", { # values don't change legend order s1 <- scale_colour_manual( - values = c("8" = "c", "4" = "a", "6" = "b"), + values = c("8" = "c", "4" = "a", "6" = "b") ) s1$train(c("8", "6", "4")) expect_equal(s1$map(c("8", "6", "4")), c("c", "b", "a"))