diff --git a/NEWS.md b/NEWS.md index 941e5d47fa..9de0a85eee 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # ggplot2 (development version) +* Allowed reversing of discrete scales by re-writing `get_limits()` (@AnneLyng, #3115) + * Added `stat_contour_filled()` and `geom_contour_filled()`, which compute and draw filled contours of gridded data (@paleolimbot, #3044). diff --git a/R/scale-discrete-.r b/R/scale-discrete-.r index 6ba8b89d7e..afcc4a0794 100644 --- a/R/scale-discrete-.r +++ b/R/scale-discrete-.r @@ -83,9 +83,17 @@ ScaleDiscretePosition <- ggproto("ScaleDiscretePosition", ScaleDiscrete, }, get_limits = function(self) { - if (self$is_empty()) return(c(0, 1)) - - self$limits %||% self$range$range %||% integer() + if (self$is_empty()) { + c(0, 1) + } else if (!is.null(self$limits) & !is.function(self$limits)){ + self$limits + } else if (is.null(self$limits)) { + self$range$range + } else if (is.function(self$limits)) { + self$limits(self$range$range) + } else { + integer(0) + } }, is_empty = function(self) { diff --git a/tests/testthat/test-scale-discrete.R b/tests/testthat/test-scale-discrete.R index 094d97ce84..79b5c74a17 100644 --- a/tests/testthat/test-scale-discrete.R +++ b/tests/testthat/test-scale-discrete.R @@ -69,3 +69,9 @@ test_that("discrete scale shrinks to range when setting limits", { expect_equal(layer_scales(p)$x$dimension(c(0, 1)), c(0, 3)) }) + +test_that("discrete position scales can accept functional limits", { + scale <- scale_x_discrete(limits = rev) + scale$train(c("a", "b", "c")) + expect_identical(scale$get_limits(), c("c", "b", "a")) +})