@@ -123,19 +123,68 @@ module.exports = function(gd) {
123
123
124
124
// update data <--> pixel coordinate conversion methods
125
125
126
- var range0 = axisOpts . r2l ( opts . range [ 0 ] ) ;
127
- var range1 = axisOpts . r2l ( opts . range [ 1 ] ) ;
128
- var dist = range1 - range0 ;
126
+ opts . _rl = Lib . simpleMap ( opts . range , axisOpts . r2l ) ;
127
+ var rl0 = opts . _rl [ 0 ] ;
128
+ var rl1 = opts . _rl [ 1 ] ;
129
+ var drl = rl1 - rl0 ;
129
130
130
131
opts . p2d = function ( v ) {
131
- return ( v / opts . _width ) * dist + range0 ;
132
+ return ( v / opts . _width ) * drl + rl0 ;
132
133
} ;
133
134
134
135
opts . d2p = function ( v ) {
135
- return ( v - range0 ) / dist * opts . _width ;
136
+ return ( v - rl0 ) / drl * opts . _width ;
136
137
} ;
137
138
138
- opts . _rl = [ range0 , range1 ] ;
139
+ if ( axisOpts . breaks ) {
140
+ var rsBreaks = axisOpts . locateBreaks ( rl0 , rl1 ) ;
141
+
142
+ if ( rsBreaks . length ) {
143
+ var j , brk ;
144
+
145
+ var lBreaks = 0 ;
146
+ for ( j = 0 ; j < rsBreaks . length ; j ++ ) {
147
+ brk = rsBreaks [ j ] ;
148
+ lBreaks += ( brk . max - brk . min ) ;
149
+ }
150
+
151
+ // compute slope and piecewise offsets
152
+ var m2 = opts . _width / ( rl1 - rl0 - lBreaks ) ;
153
+ var _B = [ - m2 * rl0 ] ;
154
+ for ( j = 0 ; j < rsBreaks . length ; j ++ ) {
155
+ brk = rsBreaks [ j ] ;
156
+ _B . push ( _B [ _B . length - 1 ] - m2 * ( brk . max - brk . min ) ) ;
157
+ }
158
+
159
+ opts . d2p = function ( v ) {
160
+ var b = _B [ 0 ] ;
161
+ for ( var j = 0 ; j < rsBreaks . length ; j ++ ) {
162
+ var brk = rsBreaks [ j ] ;
163
+ if ( v >= brk . max ) b = _B [ j + 1 ] ;
164
+ else if ( v < brk . min ) break ;
165
+ }
166
+ return b + m2 * v ;
167
+ } ;
168
+
169
+ // fill pixel (i.e. 'p') min/max here,
170
+ // to not have to loop through the _breaks twice during `p2d`
171
+ for ( j = 0 ; j < rsBreaks . length ; j ++ ) {
172
+ brk = rsBreaks [ j ] ;
173
+ brk . pmin = opts . d2p ( brk . min ) ;
174
+ brk . pmax = opts . d2p ( brk . max ) ;
175
+ }
176
+
177
+ opts . p2d = function ( v ) {
178
+ var b = _B [ 0 ] ;
179
+ for ( var j = 0 ; j < rsBreaks . length ; j ++ ) {
180
+ var brk = rsBreaks [ j ] ;
181
+ if ( v >= brk . pmax ) b = _B [ j + 1 ] ;
182
+ else if ( v < brk . pmin ) break ;
183
+ }
184
+ return ( v - b ) / m2 ;
185
+ } ;
186
+ }
187
+ }
139
188
140
189
if ( oppAxisRangeOpts . rangemode !== 'match' ) {
141
190
var range0OppAxis = oppAxisOpts . r2l ( oppAxisRangeOpts . range [ 0 ] ) ;
@@ -404,13 +453,21 @@ function drawRangePlot(rangeSlider, gd, axisOpts, opts) {
404
453
_context : gd . _context
405
454
} ;
406
455
456
+ if ( axisOpts . breaks ) {
457
+ mockFigure . layout . xaxis . breaks = axisOpts . breaks ;
458
+ }
459
+
407
460
mockFigure . layout [ oppAxisName ] = {
408
461
type : oppAxisOpts . type ,
409
462
domain : [ 0 , 1 ] ,
410
463
range : oppAxisRangeOpts . rangemode !== 'match' ? oppAxisRangeOpts . range . slice ( ) : oppAxisOpts . range . slice ( ) ,
411
464
calendar : oppAxisOpts . calendar
412
465
} ;
413
466
467
+ if ( oppAxisOpts . breaks ) {
468
+ mockFigure . layout [ oppAxisName ] . breaks = oppAxisOpts . breaks ;
469
+ }
470
+
414
471
Plots . supplyDefaults ( mockFigure ) ;
415
472
416
473
var xa = mockFigure . _fullLayout . xaxis ;
0 commit comments