@@ -657,6 +657,9 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
657
657
minor_breaks = waiver(),
658
658
n.breaks = NULL ,
659
659
trans = transform_identity(),
660
+ freeze_breaks = FALSE ,
661
+ frozen_breaks = NULL ,
662
+ frozen_minor_breaks = NULL ,
660
663
661
664
is_discrete = function () FALSE ,
662
665
@@ -749,10 +752,14 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
749
752
)
750
753
}
751
754
755
+ breaks_are_frozen <- ! is.null(self $ frozen_breaks )
756
+
752
757
# Compute `zero_range()` in transformed space in case `limits` in data space
753
758
# don't support conversion to numeric (#5304)
754
759
if (zero_range(as.numeric(transformation $ transform(limits )))) {
755
760
breaks <- limits [1 ]
761
+ } else if (self $ freeze_breaks && breaks_are_frozen ) {
762
+ breaks <- self $ frozen_breaks
756
763
} else if (is.waive(self $ breaks )) {
757
764
if (! is.null(self $ n.breaks ) && trans_support_nbreaks(transformation )) {
758
765
breaks <- transformation $ breaks(limits , self $ n.breaks )
@@ -771,6 +778,10 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
771
778
breaks <- self $ breaks
772
779
}
773
780
781
+ if (self $ freeze_breaks && ! breaks_are_frozen ) {
782
+ self $ frozen_breaks <- breaks
783
+ }
784
+
774
785
# Breaks in data space need to be converted back to transformed space
775
786
transformation $ transform(breaks )
776
787
},
@@ -794,8 +805,12 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
794
805
# some transforms assume finite major breaks
795
806
b <- b [is.finite(b )]
796
807
808
+ breaks_are_frozen <- ! is.null(self $ frozen_minor_breaks )
809
+
797
810
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 )) {
799
814
if (is.null(b )) {
800
815
breaks <- NULL
801
816
} else {
@@ -819,6 +834,10 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
819
834
breaks <- transformation $ transform(self $ minor_breaks )
820
835
}
821
836
837
+ if (self $ freeze_breaks && ! breaks_are_frozen ) {
838
+ self $ frozen_minor_breaks <- breaks
839
+ }
840
+
822
841
# Any minor breaks outside the dimensions need to be thrown away
823
842
discard(breaks , limits )
824
843
},
@@ -875,6 +894,8 @@ ScaleContinuous <- ggproto("ScaleContinuous", Scale,
875
894
clone = function (self ) {
876
895
new <- ggproto(NULL , self )
877
896
new $ range <- ContinuousRange $ new()
897
+ new $ frozen_breaks <- NULL
898
+ new $ frozen_minor_breaks <- NULL
878
899
new
879
900
},
880
901
0 commit comments