Skip to content

Commit 11c8ea2

Browse files
committed
fix rangebreaks mapping on reversed ranges - issue 4700
1 parent 4c66949 commit 11c8ea2

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

src/plots/cartesian/set_convert.js

+20-16
Original file line numberDiff line numberDiff line change
@@ -198,21 +198,27 @@ module.exports = function setConvert(ax, fullLayout) {
198198
if(!len) return _l2p(v, ax._m, ax._b);
199199

200200
var isY = axLetter === 'y';
201-
var pos = isY ? -v : v;
201+
var pos = v;
202202

203-
var q = 0;
204-
for(var i = 0; i < len; i++) {
203+
var flip = isY;
204+
if(ax.range[0] > ax.range[1]) flip = !flip;
205+
var signAx = flip ? -1 : 1;
206+
207+
var first = 0;
208+
var last = len - 1;
209+
var q = first;
210+
for(var i = first; i <= last; i += 1) {
205211
var nextI = i + 1;
206212
var brk = ax._rangebreaks[i];
207213

208-
var min = isY ? -brk.max : brk.min;
209-
var max = isY ? -brk.min : brk.max;
214+
var min = brk.min;
215+
var max = brk.max;
210216

211-
if(pos < min) break;
212-
if(pos > max) q = nextI;
217+
if(signAx * pos < signAx * min) break;
218+
if(signAx * pos > signAx * max) q = nextI;
213219
else {
214220
// when falls into break, pick 'closest' offset
215-
q = pos > (min + max) / 2 ? nextI : i;
221+
q = signAx * pos > signAx * (min + max) / 2 ? nextI : i;
216222
break;
217223
}
218224
}
@@ -226,18 +232,15 @@ module.exports = function setConvert(ax, fullLayout) {
226232
var isY = axLetter === 'y';
227233
var pos = px;
228234

229-
var reversed = ax.range[0] > ax.range[1];
230-
var signAx = reversed ? -1 : 1;
231-
232235
var first = 0;
233236
var last = len - 1;
234237
var q = first;
235238
for(var i = first; i <= last; i += 1) {
236239
var nextI = i + 1;
237240
var brk = ax._rangebreaks[i];
238241

239-
if(signAx * pos < signAx * brk.pmin) break;
240-
if(signAx * pos > signAx * brk.pmax) q = nextI;
242+
if(pos < brk.pmin) break;
243+
if(pos > brk.pmax) q = nextI;
241244
}
242245

243246
return _p2l(px, (isY ? -1 : 1) * ax._m2, ax._B[q]);
@@ -586,13 +589,14 @@ module.exports = function setConvert(ax, fullLayout) {
586589
ax._B.push(-ax._m2 * rl0);
587590
}
588591

592+
if(axReverse) {
593+
ax._rangebreaks.reverse();
594+
}
595+
589596
for(i = 0; i < ax._rangebreaks.length; i++) {
590597
brk = ax._rangebreaks[i];
591598
ax._B.push(ax._B[ax._B.length - 1] - ax._m2 * (brk.max - brk.min) * signAx);
592599
}
593-
if(axReverse) {
594-
ax._B.reverse();
595-
}
596600

597601
// fill pixel (i.e. 'p') min/max here,
598602
// to not have to loop through the _rangebreaks twice during `p2l`
Loading
Loading

0 commit comments

Comments
 (0)