@@ -119,7 +119,7 @@ sec_axis <- function(transform = NULL,
119119# ' @rdname sec_axis
120120# '
121121# ' @export
122- dup_axis <- function (transform = ~ . , name = derive(), breaks = derive(),
122+ dup_axis <- function (transform = identity , name = derive(), breaks = derive(),
123123 labels = derive(), guide = derive(), trans = deprecated()) {
124124 sec_axis(transform , trans = trans , name , breaks , labels , guide )
125125}
@@ -130,6 +130,11 @@ is.sec_axis <- function(x) {
130130
131131set_sec_axis <- function (sec.axis , scale ) {
132132 if (! is.waive(sec.axis )) {
133+ if (scale $ is_discrete()) {
134+ if (! identical(.subset2(sec.axis , " trans" ), identity )) {
135+ cli :: cli_abort(" Discrete secondary axes must have the {.fn identity} transformation." )
136+ }
137+ }
133138 if (is.formula(sec.axis )) sec.axis <- sec_axis(sec.axis )
134139 if (! is.sec_axis(sec.axis )) {
135140 cli :: cli_abort(" Secondary axes must be specified using {.fn sec_axis}." )
@@ -179,7 +184,13 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
179184 }
180185 if (is.derived(self $ name ) && ! is.waive(scale $ name )) self $ name <- scale $ name
181186 if (is.derived(self $ breaks )) self $ breaks <- scale $ breaks
182- if (is.waive(self $ breaks )) self $ breaks <- scale $ get_transformation()$ breaks
187+ if (is.waive(self $ breaks )) {
188+ if (scale $ is_discrete()) {
189+ self $ breaks <- scale $ get_breaks()
190+ } else {
191+ self $ breaks <- scale $ get_transformation()$ breaks
192+ }
193+ }
183194 if (is.derived(self $ labels )) self $ labels <- scale $ labels
184195 if (is.derived(self $ guide )) self $ guide <- scale $ guide
185196 },
@@ -214,10 +225,15 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
214225 if (self $ empty()) return ()
215226
216227 # Test for monotonicity on unexpanded range
217- self $ mono_test(scale )
228+ if (! scale $ is_discrete()) {
229+ self $ mono_test(scale )
230+ breaks <- self $ breaks
231+ } else {
232+ breaks <- scale $ map(self $ breaks )
233+ }
218234
219235 # Get scale's original range before transformation
220- transformation <- scale $ get_transformation()
236+ transformation <- scale $ get_transformation() % || % transform_identity()
221237 along_range <- seq(range [1 ], range [2 ], length.out = self $ detail )
222238 old_range <- transformation $ inverse(along_range )
223239
@@ -245,7 +261,7 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
245261 old_val_trans <- rescale(range_info $ major , from = c(0 , 1 ), to = range )
246262 old_val_minor_trans <- rescale(range_info $ minor , from = c(0 , 1 ), to = range )
247263 } else {
248- temp_scale <- self $ create_scale(new_range )
264+ temp_scale <- self $ create_scale(new_range , breaks = breaks )
249265 range_info <- temp_scale $ break_info()
250266
251267 # Map the break values back to their correct position on the primary scale
@@ -294,10 +310,11 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
294310 },
295311
296312 # Temporary scale for the purpose of calling break_info()
297- create_scale = function (self , range , transformation = transform_identity()) {
313+ create_scale = function (self , range , transformation = transform_identity(),
314+ breaks = self $ breaks ) {
298315 scale <- ggproto(NULL , ScaleContinuousPosition ,
299316 name = self $ name ,
300- breaks = self $ breaks ,
317+ breaks = breaks ,
301318 labels = self $ labels ,
302319 limits = range ,
303320 expand = c(0 , 0 ),
0 commit comments