Skip to content

Commit f9618ac

Browse files
committed
POC bin breaks derived from scale breaks
1 parent b29b831 commit f9618ac

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

R/scale-.R

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,9 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
657657
minor_breaks = waiver(),
658658
n.breaks = NULL,
659659
trans = transform_identity(),
660+
freeze_breaks = FALSE,
661+
frozen_breaks = NULL,
662+
frozen_minor_breaks = NULL,
660663

661664
is_discrete = function() FALSE,
662665

@@ -749,10 +752,14 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
749752
)
750753
}
751754

755+
breaks_are_frozen <- !is.null(self$frozen_breaks)
756+
752757
# Compute `zero_range()` in transformed space in case `limits` in data space
753758
# don't support conversion to numeric (#5304)
754759
if (zero_range(as.numeric(transformation$transform(limits)))) {
755760
breaks <- limits[1]
761+
} else if (self$freeze_breaks && breaks_are_frozen) {
762+
breaks <- self$frozen_breaks
756763
} else if (is.waive(self$breaks)) {
757764
if (!is.null(self$n.breaks) && trans_support_nbreaks(transformation)) {
758765
breaks <- transformation$breaks(limits, self$n.breaks)
@@ -771,6 +778,10 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
771778
breaks <- self$breaks
772779
}
773780

781+
if (self$freeze_breaks && !breaks_are_frozen) {
782+
self$frozen_breaks <- breaks
783+
}
784+
774785
# Breaks in data space need to be converted back to transformed space
775786
transformation$transform(breaks)
776787
},
@@ -794,8 +805,12 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
794805
# some transforms assume finite major breaks
795806
b <- b[is.finite(b)]
796807

808+
breaks_are_frozen <- !is.null(self$frozen_minor_breaks)
809+
797810
transformation <- self$get_transformation()
798-
if (is.waive(self$minor_breaks)) {
811+
if (self$freeze_breaks && breaks_are_frozen) {
812+
breaks <- self$frozen_minor_breaks
813+
} else if (is.waive(self$minor_breaks)) {
799814
if (is.null(b)) {
800815
breaks <- NULL
801816
} else {
@@ -819,6 +834,10 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
819834
breaks <- transformation$transform(self$minor_breaks)
820835
}
821836

837+
if (self$freeze_breaks && !breaks_are_frozen) {
838+
self$frozen_minor_breaks <- breaks
839+
}
840+
822841
# Any minor breaks outside the dimensions need to be thrown away
823842
discard(breaks, limits)
824843
},
@@ -875,6 +894,8 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
875894
clone = function(self) {
876895
new <- ggproto(NULL, self)
877896
new$range <- ContinuousRange$new()
897+
new$frozen_breaks <- NULL
898+
new$frozen_minor_breaks <- NULL
878899
new
879900
},
880901

R/stat-bin.R

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ stat_bin <- function(mapping = NULL, data = NULL,
5959
closed = c("right", "left"),
6060
pad = FALSE,
6161
na.rm = FALSE,
62+
follow.scale = FALSE,
6263
keep.zeroes = "all",
6364
orientation = NA,
6465
show.legend = NA,
@@ -81,6 +82,7 @@ stat_bin <- function(mapping = NULL, data = NULL,
8182
closed = closed,
8283
pad = pad,
8384
na.rm = na.rm,
85+
follow.scale = follow.scale,
8486
orientation = orientation,
8587
keep.zeroes = keep.zeroes,
8688
...
@@ -150,11 +152,15 @@ StatBin <- ggproto("StatBin", Stat,
150152
center = NULL, boundary = NULL,
151153
closed = c("right", "left"), pad = FALSE,
152154
breaks = NULL, flipped_aes = FALSE, keep.zeroes = "all",
155+
follow.scale = FALSE,
153156
# The following arguments are not used, but must
154157
# be listed so parameters are computed correctly
155158
origin = NULL, right = NULL, drop = NULL) {
156159
x <- flipped_names(flipped_aes)$x
157-
if (!is.null(breaks)) {
160+
if (follow.scale) {
161+
breaks <- scales[[x]]$get_breaks()
162+
bins <- bin_breaks(breaks, closed)
163+
} else if (!is.null(breaks)) {
158164
if (is.function(breaks)) {
159165
breaks <- breaks(data[[x]])
160166
}

0 commit comments

Comments
 (0)