@@ -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
0 commit comments