Skip to content

Commit a417cf4

Browse files
authored
Transform midpoint argument in relevant scales (#5518)
* transform midpoint * add test * check_transformation takes an argument name to report * handle transformation in `mid_rescaler()` * repeat less * add news bullet * redocument * Better call wiring * update trans -> transform
1 parent 9d1f81c commit a417cf4

File tree

7 files changed

+92
-47
lines changed

7 files changed

+92
-47
lines changed

NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# ggplot2 (development version)
22

3+
* (breaking) In the `scale_{colour/fill}_gradient2()` and
4+
`scale_{colour/fill}_steps2()` functions, the `midpoint` argument is
5+
transformed by the scale transformation (#3198).
6+
37
* `guide_colourbar()` and `guide_coloursteps()` gain an `alpha` argument to
48
set the transparency of the bar (#5085).
59

R/scale-.R

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ check_breaks_labels <- function(breaks, labels, call = NULL) {
609609
default_transform <- function(self, x) {
610610
transformation <- self$get_transformation()
611611
new_x <- transformation$transform(x)
612-
check_transformation(x, new_x, self$transformation$name, self$call)
612+
check_transformation(x, new_x, self$transformation$name, call = self$call)
613613
new_x
614614
}
615615

@@ -1329,13 +1329,17 @@ scale_flip_position <- function(scale) {
13291329
invisible()
13301330
}
13311331

1332-
check_transformation <- function(x, transformed, name, call = NULL) {
1333-
if (any(is.finite(x) != is.finite(transformed))) {
1334-
cli::cli_warn(
1335-
"{.field {name}} transformation introduced infinite values.",
1336-
call = call
1337-
)
1332+
check_transformation <- function(x, transformed, name, arg = NULL, call = NULL) {
1333+
if (!any(is.finite(x) != is.finite(transformed))) {
1334+
return(invisible())
1335+
}
1336+
if (is.null(arg)) {
1337+
end <- "."
1338+
} else {
1339+
end <- paste0(" in {.arg {arg}}.")
13381340
}
1341+
msg <- paste0("{.field {name}} transformation introduced infinite values", end)
1342+
cli::cli_warn(msg, call = call)
13391343
}
13401344

13411345
trans_support_nbreaks <- function(trans) {

R/scale-gradient.R

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,37 +90,47 @@ scale_fill_gradient <- function(..., low = "#132B43", high = "#56B1F7", space =
9090
}
9191

9292
#' @inheritParams scales::pal_div_gradient
93+
#' @inheritParams continuous_scale
9394
#' @param midpoint The midpoint (in data value) of the diverging scale.
9495
#' Defaults to 0.
9596
#' @rdname scale_gradient
9697
#' @export
9798
scale_colour_gradient2 <- function(..., low = muted("red"), mid = "white", high = muted("blue"),
98-
midpoint = 0, space = "Lab", na.value = "grey50", guide = "colourbar",
99+
midpoint = 0, space = "Lab", na.value = "grey50",
100+
transform = "identity", guide = "colourbar",
99101
aesthetics = "colour") {
100102
continuous_scale(
101103
aesthetics,
102-
palette = pal_div_gradient(low, mid, high, space),
103-
na.value = na.value, guide = guide, ...,
104-
rescaler = mid_rescaler(mid = midpoint)
104+
palette = div_gradient_pal(low, mid, high, space),
105+
na.value = na.value, transform = transform, guide = guide, ...,
106+
rescaler = mid_rescaler(mid = midpoint, transform = transform)
105107
)
106108
}
107109

108110
#' @rdname scale_gradient
109111
#' @export
110112
scale_fill_gradient2 <- function(..., low = muted("red"), mid = "white", high = muted("blue"),
111-
midpoint = 0, space = "Lab", na.value = "grey50", guide = "colourbar",
113+
midpoint = 0, space = "Lab", na.value = "grey50",
114+
transform = "identity", guide = "colourbar",
112115
aesthetics = "fill") {
113116
continuous_scale(
114117
aesthetics,
115-
palette = pal_div_gradient(low, mid, high, space),
116-
na.value = na.value, guide = guide, ...,
117-
rescaler = mid_rescaler(mid = midpoint)
118+
palette = div_gradient_pal(low, mid, high, space),
119+
na.value = na.value, transform = transform, guide = guide, ...,
120+
rescaler = mid_rescaler(mid = midpoint, transform = transform)
118121
)
119122
}
120123

121-
mid_rescaler <- function(mid) {
124+
mid_rescaler <- function(mid, transform = "identity",
125+
arg = caller_arg(mid), call = caller_env()) {
126+
transform <- as.trans(transform)
127+
trans_mid <- transform$transform(mid)
128+
check_transformation(
129+
mid, trans_mid, transform$name,
130+
arg = arg, call = call
131+
)
122132
function(x, to = c(0, 1), from = range(x, na.rm = TRUE)) {
123-
rescale_mid(x, to, from, mid)
133+
rescale_mid(x, to, from, trans_mid)
124134
}
125135
}
126136

R/scale-steps.R

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,13 @@ scale_colour_steps <- function(..., low = "#132B43", high = "#56B1F7", space = "
5252
#' @rdname scale_steps
5353
#' @export
5454
scale_colour_steps2 <- function(..., low = muted("red"), mid = "white", high = muted("blue"),
55-
midpoint = 0, space = "Lab", na.value = "grey50", guide = "coloursteps",
55+
midpoint = 0, space = "Lab", na.value = "grey50",
56+
transform = "identity", guide = "coloursteps",
5657
aesthetics = "colour") {
57-
binned_scale(aesthetics, palette = pal_div_gradient(low, mid, high, space),
58-
na.value = na.value, guide = guide, rescaler = mid_rescaler(mid = midpoint), ...)
58+
binned_scale(aesthetics, palette = div_gradient_pal(low, mid, high, space),
59+
na.value = na.value, transform = transform, guide = guide,
60+
rescaler = mid_rescaler(mid = midpoint, transform = transform),
61+
...)
5962
}
6063
#' @rdname scale_steps
6164
#' @export
@@ -75,10 +78,12 @@ scale_fill_steps <- function(..., low = "#132B43", high = "#56B1F7", space = "La
7578
#' @rdname scale_steps
7679
#' @export
7780
scale_fill_steps2 <- function(..., low = muted("red"), mid = "white", high = muted("blue"),
78-
midpoint = 0, space = "Lab", na.value = "grey50", guide = "coloursteps",
81+
midpoint = 0, space = "Lab", na.value = "grey50",
82+
transform = "identity", guide = "coloursteps",
7983
aesthetics = "fill") {
80-
binned_scale(aesthetics, palette = pal_div_gradient(low, mid, high, space),
81-
na.value = na.value, guide = guide, rescaler = mid_rescaler(mid = midpoint), ...)
84+
binned_scale(aesthetics, palette = div_gradient_pal(low, mid, high, space),
85+
na.value = na.value, transform = transform, guide = guide,
86+
rescaler = mid_rescaler(mid = midpoint, transform = transform), ...)
8287
}
8388
#' @rdname scale_steps
8489
#' @export

man/scale_gradient.Rd

Lines changed: 15 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/scale_steps.Rd

Lines changed: 15 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-scale-gradient.R

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,19 @@ test_that("points outside the limits are plotted as NA", {
99
correct_fill <- c("#B26D65", "#DCB4AF", "orange")
1010
expect_equal(layer_data(p)$fill, correct_fill)
1111
})
12+
13+
test_that("midpoints are transformed", {
14+
15+
scale <- scale_colour_gradient2(midpoint = 1, trans = "identity")
16+
scale$train(c(0, 3))
17+
expect_equal(scale$rescale(c(0, 3)), c(0.25, 1))
18+
19+
scale <- scale_colour_gradient2(midpoint = 10, trans = "log10")
20+
scale$train(scale$transform(c(1, 1000)))
21+
ans <- scale$rescale(c(0, 3), c(0.25, 1))
22+
23+
expect_warning(
24+
scale_colour_gradient2(midpoint = 0, transform = "log10"),
25+
"introduced infinite values"
26+
)
27+
})

0 commit comments

Comments
 (0)