diff --git a/R/scale-view.r b/R/scale-view.r index 689daa97ca..67b291e4ad 100644 --- a/R/scale-view.r +++ b/R/scale-view.r @@ -16,7 +16,9 @@ view_scale_primary <- function(scale, limits = scale$get_limits(), continuous_range = scale$dimension(limits = limits)) { if(!scale$is_discrete()) { - breaks <- scale$get_breaks(continuous_range) + # continuous_range can be specified in arbitrary order, but + # continuous scales expect the one in ascending order. + breaks <- scale$get_breaks(sort(continuous_range)) minor_breaks <- scale$get_breaks_minor(b = breaks, limits = continuous_range) } else { breaks <- scale$get_breaks(limits) diff --git a/tests/testthat/test-scales-breaks-labels.r b/tests/testthat/test-scales-breaks-labels.r index 3c8edf800a..b64b4b8186 100644 --- a/tests/testthat/test-scales-breaks-labels.r +++ b/tests/testthat/test-scales-breaks-labels.r @@ -260,7 +260,12 @@ test_that("equal length breaks and labels can be passed to ViewScales with limit test_view_scale <- view_scale_primary(test_scale) expect_identical(test_view_scale$get_breaks(), c(NA, 20, NA)) - expect_identical(test_scale$get_labels(), c(c("0", "20", "40"))) + expect_identical(test_view_scale$get_labels(), c(c("0", "20", "40"))) + + # ViewScale accepts the limits in the opposite order (#3952) + test_view_scale_rev <- view_scale_primary(test_scale, limits = rev(test_scale$get_limits())) + expect_identical(test_view_scale_rev$get_breaks(), c(NA, 20, NA)) + expect_identical(test_view_scale_rev$get_labels(), c(c("0", "20", "40"))) }) # Visual tests ------------------------------------------------------------