diff --git a/NEWS.md b/NEWS.md index 6298f0413e..081504c782 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # ggplot2 (development version) +* When discrete breaks have names, they'll be used as labels by default + (@teunbrand, #6147). * The helper function `is.waiver()` is now exported to help extensions to work with `waiver()` objects (@arcresu, #6173). * Date(time) scales now throw appropriate errors when `date_breaks`, diff --git a/R/axis-secondary.R b/R/axis-secondary.R index 401dd5a663..23d36092b6 100644 --- a/R/axis-secondary.R +++ b/R/axis-secondary.R @@ -186,7 +186,7 @@ AxisSecondary <- ggproto("AxisSecondary", NULL, if (is.derived(self$breaks)) self$breaks <- scale$breaks if (is.waiver(self$breaks)) { if (scale$is_discrete()) { - self$breaks <- scale$get_breaks() + self$breaks <- setNames(nm = scale$get_breaks()) } else { breaks <- scale$get_transformation()$breaks n_breaks <- scale$n.breaks @@ -235,7 +235,7 @@ AxisSecondary <- ggproto("AxisSecondary", NULL, self$mono_test(scale) breaks <- self$breaks } else { - breaks <- scale$map(self$breaks) + breaks <- setNames(scale$map(self$breaks), names(self$breaks)) } # Get scale's original range before transformation diff --git a/R/scale-.R b/R/scale-.R index 94887df365..b8c03571bd 100644 --- a/R/scale-.R +++ b/R/scale-.R @@ -1031,7 +1031,8 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale, } # Breaks only occur only on values in domain - in_domain <- intersect(breaks, limits) + breaks <- setNames(as.character(breaks), names(breaks)) + in_domain <- vec_set_intersect(breaks, as.character(limits)) structure(in_domain, pos = match(in_domain, breaks)) }, @@ -1085,6 +1086,9 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale, } if (is.waiver(self$labels)) { + if (!is.null(names(breaks))) { + return(names(breaks)) + } if (is.numeric(breaks)) { # Only format numbers, because on Windows, format messes up encoding format(breaks, justify = "none") diff --git a/tests/testthat/test-scales-breaks-labels.R b/tests/testthat/test-scales-breaks-labels.R index 899c048e71..42e3d67bb3 100644 --- a/tests/testthat/test-scales-breaks-labels.R +++ b/tests/testthat/test-scales-breaks-labels.R @@ -289,6 +289,17 @@ test_that("equal length breaks and labels can be passed to ViewScales with limit expect_identical(test_view_scale_rev$get_labels(), c(c("0", "20", "40"))) }) +test_that("break names are returned as labels", { + + sc <- scale_x_continuous(breaks = c(A = 10, B = 20, C = 30)) + sc$train(c(10, 30)) + expect_equal(sc$get_labels(), c("A", "B", "C")) + + sc <- scale_x_discrete(breaks = c(foo = "A", bar = "B", qux = "C")) + sc$train(c(LETTERS[1:3])) + expect_equal(sc$get_labels(), c("foo", "bar", "qux")) +}) + # Visual tests ------------------------------------------------------------ test_that("minor breaks draw correctly", {