diff --git a/NEWS.md b/NEWS.md index a369c4dccb..53b423dede 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ # ggplot2 2.2.1.9000 +* Fix bug in secondary axis that would lead to incorrectly placed ticks with + strong transforms (@thomasp85, #1992) + * Fix `update_geom_defaults()` and `update_stat_defaults()` to allow American spelling of aesthetic parameters (@foo-bar-baz-qux, #2299). * Fixed bug when setting strips to `element_blank()` (@thomasp85). diff --git a/R/axis-secondary.R b/R/axis-secondary.R index 28ac8a3633..5d216ce635 100644 --- a/R/axis-secondary.R +++ b/R/axis-secondary.R @@ -114,10 +114,10 @@ AxisSecondary <- ggproto("AxisSecondary", NULL, if (self$empty()) return() # Get original range before transformation - inv_range <- scale$trans$inverse(range) + along_range <- seq(range[1], range[2], length.out = self$detail) + old_range <- scale$trans$inverse(along_range) # Create mapping between primary and secondary range - old_range <- seq(inv_range[1], inv_range[2], length.out = self$detail) full_range <- self$transform_range(old_range) # Test for monotonicity diff --git a/tests/figs/deps.txt b/tests/figs/deps.txt index 263e86625b..9267df5c0e 100644 --- a/tests/figs/deps.txt +++ b/tests/figs/deps.txt @@ -1,3 +1,3 @@ -vdiffr: 0.1.1.9000 +vdiffr: 0.1.1 svglite: 1.2.0.9001 ggplot2: 2.2.1.9000 diff --git a/tests/figs/sec-axis/sec-axis-skewed-transform.svg b/tests/figs/sec-axis/sec-axis-skewed-transform.svg new file mode 100644 index 0000000000..ca727e8bd8 --- /dev/null +++ b/tests/figs/sec-axis/sec-axis-skewed-transform.svg @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1e-01 +1e+00 +1e+01 +1e+02 +1e+03 + + + + + +0.00 +0.25 +0.50 +0.75 +1.00 + + + + + + + + + + + + +1e-03 +1e-02 +1e-01 +1e+00 +1e+01 +1e+02 +1e+03 +Unit B +Unit A +y +sec_axis, skewed transform + diff --git a/tests/testthat/test-sec-axis.R b/tests/testthat/test-sec-axis.R new file mode 100644 index 0000000000..2033eb0cfd --- /dev/null +++ b/tests/testthat/test-sec-axis.R @@ -0,0 +1,48 @@ +context("sec-axis") + +x <- exp(seq(log(0.001), log(1000), length.out = 100)) +foo <- data.frame( + x = x, + y = x/(1+x) +) + +test_that("dup_axis() works", { + p <- ggplot(foo, aes(x, y)) + + geom_point() + + scale_x_continuous(name = "Unit A", + sec.axis = dup_axis()) + scale <- layer_scales(p)$x + expect_equal(scale$sec_name(), scale$name) + breaks <- scale$break_info() + expect_equal(breaks$minor, breaks$sec.minor) + expect_equal(breaks$major_source, breaks$sec.major_source) +}) + +test_that("custom breaks works", { + custom_breaks <- c(0.01, 0.1, 1, 10, 100) + p <- ggplot(foo, aes(x, y)) + + geom_point() + + scale_x_continuous( + name = "Unit A", + sec.axis = sec_axis( + trans = y~., + breaks = custom_breaks + ) + ) + scale <- layer_scales(p)$x + breaks <- scale$break_info() + expect_equal(custom_breaks, breaks$sec.major_source) +}) + +test_that("sec axis works with skewed transform", { + vdiffr::expect_doppelganger( + "sec_axis, skewed transform", + ggplot(foo, aes(x, y)) + + geom_point() + + scale_x_continuous(name = "Unit A", trans = 'log', + breaks = c(0.001, 0.01, 0.1, 1, 10, 100, 1000), + sec.axis = sec_axis(~. * 100, name = "Unit B", + labels = derive(), + breaks = derive())) + ) +})