Skip to content

Commit f828794

Browse files
authored
✨ Using date breaks/minor breaks/labels in time scales. (#6282)
* Allow `transform = "hms"` in `datetime_scale()` * add date arguments to time scales * use `datetime_scale()` in time scales * allow for additional underscore args * inherit position scale * `label_time()` can handle both <POSIXt> *and* <difftime> classes * add test * add news bullet * redocument * work in a skip * Revert "`label_time()` can handle both <POSIXt> *and* <difftime> classes" This reverts commit adcd2cb. * separate labelling logic
1 parent f2ad948 commit f828794

File tree

5 files changed

+65
-19
lines changed

5 files changed

+65
-19
lines changed

NEWS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@
296296
* All scales now expose the `aesthetics` parameter (@teunbrand, #5841)
297297
* New `theme(legend.key.justification)` to control the alignment of legend keys
298298
(@teunbrand, #3669).
299+
* Added `scale_{x/y}_time(date_breaks, date_minor_breaks, date_labels)`
300+
(@teunbrand, #4335).
299301

300302
# ggplot2 3.5.1
301303

R/scale-date.R

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,11 @@ scale_y_datetime <- function(name = waiver(),
223223
#' @rdname scale_date
224224
scale_x_time <- function(name = waiver(),
225225
breaks = waiver(),
226+
date_breaks = waiver(),
226227
minor_breaks = waiver(),
228+
date_minor_breaks = waiver(),
227229
labels = waiver(),
230+
date_labels = waiver(),
228231
limits = NULL,
229232
expand = waiver(),
230233
oob = censor,
@@ -233,29 +236,37 @@ scale_x_time <- function(name = waiver(),
233236
position = "bottom",
234237
sec.axis = waiver()) {
235238

236-
scale_x_continuous(
239+
sc <- datetime_scale(
240+
ggplot_global$x_aes,
241+
"hms",
237242
name = name,
243+
palette = identity,
238244
breaks = breaks,
245+
date_breaks = date_breaks,
239246
labels = labels,
247+
date_labels = date_labels,
240248
minor_breaks = minor_breaks,
249+
date_minor_breaks = date_minor_breaks,
250+
guide = guide,
241251
limits = limits,
242252
expand = expand,
243253
oob = oob,
244-
na.value = na.value,
245-
guide = guide,
246-
position = position,
247-
transform = scales::transform_hms(),
248-
sec.axis = sec.axis
254+
position = position
249255
)
256+
257+
set_sec_axis(sec.axis, sc)
250258
}
251259

252260

253261
#' @rdname scale_date
254262
#' @export
255263
scale_y_time <- function(name = waiver(),
256264
breaks = waiver(),
265+
date_breaks = waiver(),
257266
minor_breaks = waiver(),
267+
date_minor_breaks = waiver(),
258268
labels = waiver(),
269+
date_labels = waiver(),
259270
limits = NULL,
260271
expand = waiver(),
261272
oob = censor,
@@ -264,20 +275,25 @@ scale_y_time <- function(name = waiver(),
264275
position = "left",
265276
sec.axis = waiver()) {
266277

267-
scale_y_continuous(
278+
sc <- datetime_scale(
279+
ggplot_global$y_aes,
280+
"hms",
268281
name = name,
282+
palette = identity,
269283
breaks = breaks,
284+
date_breaks = date_breaks,
270285
labels = labels,
286+
date_labels = date_labels,
271287
minor_breaks = minor_breaks,
288+
date_minor_breaks = date_minor_breaks,
289+
guide = guide,
272290
limits = limits,
273291
expand = expand,
274292
oob = oob,
275-
na.value = na.value,
276-
guide = guide,
277-
position = position,
278-
transform = scales::transform_hms(),
279-
sec.axis = sec.axis
293+
position = position
280294
)
295+
296+
set_sec_axis(sec.axis, sc)
281297
}
282298

283299
#' Date/time scale constructor
@@ -312,9 +328,13 @@ datetime_scale <- function(aesthetics, transform, trans = deprecated(),
312328
}
313329
if (!is.waiver(date_labels)) {
314330
check_string(date_labels)
315-
labels <- function(self, x) {
316-
tz <- self$timezone %||% "UTC"
317-
label_date(date_labels, tz)(x)
331+
if (transform == "hms") {
332+
labels <- label_time(date_labels)
333+
} else {
334+
labels <- function(self, x) {
335+
tz <- self$timezone %||% "UTC"
336+
label_date(date_labels, tz)(x)
337+
}
318338
}
319339
}
320340

@@ -324,15 +344,17 @@ datetime_scale <- function(aesthetics, transform, trans = deprecated(),
324344
scale_class <- switch(
325345
transform,
326346
date = ScaleContinuousDate,
327-
time = ScaleContinuousDatetime
347+
time = ScaleContinuousDatetime,
348+
ScaleContinuousPosition
328349
)
329350
} else {
330351
scale_class <- ScaleContinuous
331352
}
332353

333354
transform <- switch(transform,
334355
date = transform_date(),
335-
time = transform_time(timezone)
356+
time = transform_time(timezone),
357+
hms = transform_hms()
336358
)
337359

338360
sc <- continuous_scale(

man/scale_date.Rd

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

tests/testthat/_snaps/prohibited-functions.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@
143143
[4] "date_minor_breaks"
144144
145145
$scale_x_time
146-
[1] "minor_breaks"
146+
[1] "date_breaks" "minor_breaks" "date_minor_breaks"
147+
[4] "date_labels"
147148
148149
$scale_y_continuous
149150
[1] "minor_breaks"
@@ -157,7 +158,8 @@
157158
[4] "date_minor_breaks"
158159
159160
$scale_y_time
160-
[1] "minor_breaks"
161+
[1] "date_breaks" "minor_breaks" "date_minor_breaks"
162+
[4] "date_labels"
161163
162164
$sf_transform_xy
163165
[1] "target_crs" "source_crs" "authority_compliant"

tests/testthat/test-scale-date.R

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,20 @@ test_that("not cached across calls", {
4747
expect_equal(get_panel_scales(p2)$x$timezone, "Australia/Lord_Howe")
4848
})
4949

50+
test_that("time scale date breaks and labels work", {
51+
skip_if_not_installed("hms")
52+
53+
d <- c(base_time(), base_time() + 5 * 24 * 3600) - base_time()
54+
55+
sc <- scale_x_time(date_breaks = "1 day", date_labels = "%d")
56+
sc$train(d)
57+
58+
breaks <- sc$get_breaks()
59+
expect_length(breaks, 6)
60+
labels <- sc$get_labels(breaks)
61+
expect_equal(labels, paste0("0", 1:6))
62+
})
63+
5064
test_that("datetime size scales work", {
5165
p <- ggplot(df, aes(y = y)) + geom_point(aes(time1, size = time1))
5266

0 commit comments

Comments
 (0)