Skip to content

Commit 094b957

Browse files
authored
Discrete labels from break names (#6148)
* return break names * add test * fix #6089 * add news bullet * carry over names * prevent name-dropping * swap `mtfrm()` for `as.character()`
1 parent 6606390 commit 094b957

File tree

4 files changed

+20
-3
lines changed

4 files changed

+20
-3
lines changed

NEWS.md

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

3+
* When discrete breaks have names, they'll be used as labels by default
4+
(@teunbrand, #6147).
35
* The helper function `is.waiver()` is now exported to help extensions to work
46
with `waiver()` objects (@arcresu, #6173).
57
* Date(time) scales now throw appropriate errors when `date_breaks`,

R/axis-secondary.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
186186
if (is.derived(self$breaks)) self$breaks <- scale$breaks
187187
if (is.waiver(self$breaks)) {
188188
if (scale$is_discrete()) {
189-
self$breaks <- scale$get_breaks()
189+
self$breaks <- setNames(nm = scale$get_breaks())
190190
} else {
191191
breaks <- scale$get_transformation()$breaks
192192
n_breaks <- scale$n.breaks
@@ -235,7 +235,7 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
235235
self$mono_test(scale)
236236
breaks <- self$breaks
237237
} else {
238-
breaks <- scale$map(self$breaks)
238+
breaks <- setNames(scale$map(self$breaks), names(self$breaks))
239239
}
240240

241241
# Get scale's original range before transformation

R/scale-.R

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,8 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale,
10311031
}
10321032

10331033
# Breaks only occur only on values in domain
1034-
in_domain <- intersect(breaks, limits)
1034+
breaks <- setNames(as.character(breaks), names(breaks))
1035+
in_domain <- vec_set_intersect(breaks, as.character(limits))
10351036
structure(in_domain, pos = match(in_domain, breaks))
10361037
},
10371038

@@ -1085,6 +1086,9 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale,
10851086
}
10861087

10871088
if (is.waiver(self$labels)) {
1089+
if (!is.null(names(breaks))) {
1090+
return(names(breaks))
1091+
}
10881092
if (is.numeric(breaks)) {
10891093
# Only format numbers, because on Windows, format messes up encoding
10901094
format(breaks, justify = "none")

tests/testthat/test-scales-breaks-labels.R

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,17 @@ test_that("equal length breaks and labels can be passed to ViewScales with limit
289289
expect_identical(test_view_scale_rev$get_labels(), c(c("0", "20", "40")))
290290
})
291291

292+
test_that("break names are returned as labels", {
293+
294+
sc <- scale_x_continuous(breaks = c(A = 10, B = 20, C = 30))
295+
sc$train(c(10, 30))
296+
expect_equal(sc$get_labels(), c("A", "B", "C"))
297+
298+
sc <- scale_x_discrete(breaks = c(foo = "A", bar = "B", qux = "C"))
299+
sc$train(c(LETTERS[1:3]))
300+
expect_equal(sc$get_labels(), c("foo", "bar", "qux"))
301+
})
302+
292303
# Visual tests ------------------------------------------------------------
293304

294305
test_that("minor breaks draw correctly", {

0 commit comments

Comments
 (0)