Skip to content

Commit

Permalink
fix rangebreaks mapping on reversed ranges - issue 4700
Browse files Browse the repository at this point in the history
  • Loading branch information
archmoj committed Mar 29, 2020
1 parent 4c66949 commit 11c8ea2
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 16 deletions.
36 changes: 20 additions & 16 deletions src/plots/cartesian/set_convert.js
Original file line number Diff line number Diff line change
Expand Up @@ -198,21 +198,27 @@ module.exports = function setConvert(ax, fullLayout) {
if(!len) return _l2p(v, ax._m, ax._b);

var isY = axLetter === 'y';
var pos = isY ? -v : v;
var pos = v;

var q = 0;
for(var i = 0; i < len; i++) {
var flip = isY;
if(ax.range[0] > ax.range[1]) flip = !flip;
var signAx = flip ? -1 : 1;

var first = 0;
var last = len - 1;
var q = first;
for(var i = first; i <= last; i += 1) {
var nextI = i + 1;
var brk = ax._rangebreaks[i];

var min = isY ? -brk.max : brk.min;
var max = isY ? -brk.min : brk.max;
var min = brk.min;
var max = brk.max;

if(pos < min) break;
if(pos > max) q = nextI;
if(signAx * pos < signAx * min) break;
if(signAx * pos > signAx * max) q = nextI;
else {
// when falls into break, pick 'closest' offset
q = pos > (min + max) / 2 ? nextI : i;
q = signAx * pos > signAx * (min + max) / 2 ? nextI : i;
break;
}
}
Expand All @@ -226,18 +232,15 @@ module.exports = function setConvert(ax, fullLayout) {
var isY = axLetter === 'y';
var pos = px;

var reversed = ax.range[0] > ax.range[1];
var signAx = reversed ? -1 : 1;

var first = 0;
var last = len - 1;
var q = first;
for(var i = first; i <= last; i += 1) {
var nextI = i + 1;
var brk = ax._rangebreaks[i];

if(signAx * pos < signAx * brk.pmin) break;
if(signAx * pos > signAx * brk.pmax) q = nextI;
if(pos < brk.pmin) break;
if(pos > brk.pmax) q = nextI;
}

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

if(axReverse) {
ax._rangebreaks.reverse();
}

for(i = 0; i < ax._rangebreaks.length; i++) {
brk = ax._rangebreaks[i];
ax._B.push(ax._B[ax._B.length - 1] - ax._m2 * (brk.max - brk.min) * signAx);
}
if(axReverse) {
ax._B.reverse();
}

// fill pixel (i.e. 'p') min/max here,
// to not have to loop through the _rangebreaks twice during `p2l`
Expand Down
Binary file modified test/image/baselines/axes_breaks-night_autorange-reversed.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified test/image/baselines/axes_breaks-reversed-without-pattern.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 11c8ea2

Please sign in to comment.