From 3362c11535f793956f9d539dac535afc76dc7e3b Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 27 Aug 2024 10:17:39 +0200 Subject: [PATCH 1/5] scales don't discard oob breaks --- R/scale-.R | 3 --- 1 file changed, 3 deletions(-) diff --git a/R/scale-.R b/R/scale-.R index fd0bbd444f..daf7128e83 100644 --- a/R/scale-.R +++ b/R/scale-.R @@ -1305,9 +1305,6 @@ ScaleBinned <- ggproto("ScaleBinned", Scale, breaks <- self$breaks } - # Breaks must be within limits - breaks <- oob_discard(breaks, sort(limits)) - self$breaks <- breaks transformation$transform(breaks) From aba41b2148a15fbf6254aca8e0cdb449332312ee Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 27 Aug 2024 10:18:42 +0200 Subject: [PATCH 2/5] guides deal with NA-breaks better --- R/guide-bins.R | 2 ++ R/guide-colorsteps.R | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/R/guide-bins.R b/R/guide-bins.R index 518655cbba..6b0fd9806f 100644 --- a/R/guide-bins.R +++ b/R/guide-bins.R @@ -154,6 +154,8 @@ GuideBins <- ggproto( key$.show <- NA labels <- scale$get_labels(breaks) + labels <- labels[!is.na(breaks)] + breaks <- breaks[!is.na(breaks)] if (is.character(scale$labels) || is.numeric(scale$labels)) { limit_lab <- c(NA, NA) } else { diff --git a/R/guide-colorsteps.R b/R/guide-colorsteps.R index 52b6e1809d..433bab5d72 100644 --- a/R/guide-colorsteps.R +++ b/R/guide-colorsteps.R @@ -110,11 +110,13 @@ GuideColoursteps <- ggproto( key <- data_frame0(!!aesthetic := scale$map(breaks)) if (even.steps) { - key$.value <- seq_along(breaks) + key$.value <- NA_integer_ + key$.value[!is.na(breaks)] <- seq_along(breaks[!is.na(breaks)]) } else { key$.value <- breaks } key$.label <- scale$get_labels(breaks) + key <- vec_slice(key, !is.na(breaks)) if (breaks[1] %in% limits) { key$.value <- key$.value - 1L From 706752a1ce0a6d630ccef81dbd24d51e4a0485dc Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 27 Aug 2024 10:22:18 +0200 Subject: [PATCH 3/5] `parse_binned_breaks()` preserves break length --- R/guide-bins.R | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/R/guide-bins.R b/R/guide-bins.R index 6b0fd9806f..11a5b1cc0c 100644 --- a/R/guide-bins.R +++ b/R/guide-bins.R @@ -330,19 +330,22 @@ GuideBins <- ggproto( parse_binned_breaks <- function(scale, breaks = scale$get_breaks()) { - breaks <- breaks[!is.na(breaks)] + if (is.waive(scale$labels) || is.function(scale$labels)) { + breaks <- breaks[!is.na(breaks)] + } if (length(breaks) == 0) { return(NULL) } if (is.numeric(breaks)) { - breaks <- sort(breaks) limits <- scale$get_limits() if (!is.numeric(scale$breaks)) { - breaks <- breaks[!breaks %in% limits] + breaks[breaks %in% limits] <- NA } - breaks <- oob_discard(breaks, limits) + breaks <- oob_censor(breaks, limits) all_breaks <- unique0(c(limits[1], breaks, limits[2])) + # Sorting drops NAs on purpose here + all_breaks <- sort(all_breaks, na.last = NA) bin_at <- all_breaks[-1] - diff(all_breaks) / 2 } else { bin_at <- breaks From f9dfb2dfad02ff181747a426409b17b8b9c54cb2 Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 27 Aug 2024 10:26:07 +0200 Subject: [PATCH 4/5] add test --- tests/testthat/test-guides.R | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/testthat/test-guides.R b/tests/testthat/test-guides.R index f0057a7452..f1d7e97523 100644 --- a/tests/testthat/test-guides.R +++ b/tests/testthat/test-guides.R @@ -552,6 +552,20 @@ test_that("bins can be parsed by guides for all scale types", { ) }) +test_that("binned breaks can have hardcoded labels when oob", { + + sc <- scale_colour_binned(breaks = 1:3, labels = as.character(1:3)) + sc$train(c(1, 2)) + + g <- guide_bins() + key <- g$train(scale = sc, aesthetic = "colour")$key + expect_equal(key$.label, c("1", "2")) + + g <- guide_coloursteps() + key <- g$train(scale = sc, aesthetic = "colour")$key + expect_equal(key$.label, c("1", "2")) +}) + test_that("legends can be forced to display unrelated geoms", { df <- data.frame(x = 1:2) From b0ac46add6bc1783edcb9d7cf9bf7d16f526551d Mon Sep 17 00:00:00 2001 From: Teun van den Brand Date: Tue, 27 Aug 2024 10:27:26 +0200 Subject: [PATCH 5/5] add news bullet --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 4cab4f4c79..a5e2d1eca4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ # ggplot2 (development version) +* Fixed bug in out-of-bounds binned breaks (@teunbrand, #6054) * Passing empty unmapped aesthetics to layers raises a warning instead of throwing an error (@teunbrand, #6009). * Moved {mgcv} from Imports to Suggests (@teunbrand, #5986)