@@ -210,6 +210,16 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
210
210
# Create mapping between primary and secondary range
211
211
full_range <- self $ transform_range(old_range )
212
212
213
+ # Remove duplicates in the expanded area of the range that can arise if
214
+ # the transformation is non-monotonic in the expansion. The split ensures
215
+ # the middle duplicated are kept
216
+ duplicates <- c(
217
+ ! duplicated(full_range [seq_len(self $ detail / 2 )], fromLast = TRUE ),
218
+ ! duplicated(full_range [- seq_len(self $ detail / 2 )])
219
+ )
220
+ old_range <- old_range [duplicates ]
221
+ full_range <- full_range [duplicates ]
222
+
213
223
# Get break info for the secondary axis
214
224
new_range <- range(full_range , na.rm = TRUE )
215
225
@@ -226,8 +236,7 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
226
236
227
237
# Map the break values back to their correct position on the primary scale
228
238
if (! is.null(range_info $ major_source )) {
229
- old_val <- lapply(range_info $ major_source , function (x ) which.min(abs(full_range - x )))
230
- old_val <- old_range [unlist(old_val )]
239
+ old_val <- approx(full_range , old_range , range_info $ major_source )$ y
231
240
old_val_trans <- scale $ trans $ transform(old_val )
232
241
233
242
# rescale values from 0 to 1
@@ -243,8 +252,7 @@ AxisSecondary <- ggproto("AxisSecondary", NULL,
243
252
}
244
253
245
254
if (! is.null(range_info $ minor_source )) {
246
- old_val_minor <- lapply(range_info $ minor_source , function (x ) which.min(abs(full_range - x )))
247
- old_val_minor <- old_range [unlist(old_val_minor )]
255
+ old_val_minor <- approx(full_range , old_range , range_info $ minor_source )$ y
248
256
old_val_minor_trans <- scale $ trans $ transform(old_val_minor )
249
257
250
258
range_info $ minor [] <- round(
0 commit comments