Skip to content

Commit fb94a83

Browse files
Merge pull request #7761 from plotly/fix-7717
Fix 7717 - flipped axis orientation bug
2 parents c989631 + 6414755 commit fb94a83

4 files changed

Lines changed: 76 additions & 15 deletions

File tree

src/plots/cartesian/set_convert.js

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -445,23 +445,25 @@ module.exports = function setConvert(ax, fullLayout) {
445445

446446
var bounds = Lib.simpleMap([minallowed, maxallowed], ax.r2l);
447447

448-
if(minallowed !== undefined && rng[0] < bounds[0]) range[axrev ? 1 : 0] = minallowed;
449-
if(maxallowed !== undefined && rng[1] > bounds[1]) range[axrev ? 0 : 1] = maxallowed;
450-
451-
if(range[0] === range[1]) {
452-
var minL = ax.l2r(minallowed);
453-
var maxL = ax.l2r(maxallowed);
448+
if(minallowed !== undefined && rng[0] < bounds[0]) {
449+
range[axrev ? 1 : 0] = minallowed;
450+
rng[0] = bounds[0];
451+
}
452+
if(maxallowed !== undefined && rng[1] > bounds[1]) {
453+
range[axrev ? 0 : 1] = maxallowed;
454+
rng[1] = bounds[1];
455+
}
454456

457+
// If clamping collapsed or inverted the range, extend the opposite end
458+
// so we preserve the original orientation. Otherwise a default range
459+
// entirely below minallowed (or above maxallowed) would flip the axis.
460+
if(rng[0] >= rng[1]) {
455461
if(minallowed !== undefined) {
456-
var _max = minL + 1;
457-
if(maxallowed !== undefined) _max = Math.min(_max, maxL);
458-
range[axrev ? 1 : 0] = _max;
459-
}
460-
461-
if(maxallowed !== undefined) {
462-
var _min = maxL + 1;
463-
if(minallowed !== undefined) _min = Math.max(_min, minL);
464-
range[axrev ? 0 : 1] = _min;
462+
var _max = bounds[0] + 1;
463+
if(maxallowed !== undefined) _max = Math.min(_max, bounds[1]);
464+
range[axrev ? 0 : 1] = ax.l2r(_max);
465+
} else if(maxallowed !== undefined) {
466+
range[axrev ? 1 : 0] = ax.l2r(bounds[1] - 1);
465467
}
466468
}
467469
};
-106 Bytes
Loading
-232 Bytes
Loading

test/jasmine/tests/axes_test.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,6 +1733,65 @@ describe('Test axes', function() {
17331733
});
17341734
});
17351735

1736+
describe('minallowed / maxallowed', function() {
1737+
// regression test for https://github.com/plotly/plotly.js/issues/7717
1738+
var gd;
1739+
1740+
beforeEach(function() { gd = createGraphDiv(); });
1741+
afterEach(destroyGraphDiv);
1742+
1743+
function expectForward(done, minallowed) {
1744+
Plotly.newPlot(gd, [{
1745+
x: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
1746+
y: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1747+
}], {
1748+
xaxis: { minallowed: minallowed }
1749+
}).then(function() {
1750+
var r = gd._fullLayout.xaxis.range;
1751+
expect(r[0]).toBeLessThan(r[1], 'axis should not be reversed for minallowed=' + minallowed);
1752+
expect(r[0]).toBe(minallowed, 'axis min should be pinned at minallowed');
1753+
}).then(done, done.fail);
1754+
}
1755+
1756+
it('does not reverse axis when minallowed exceeds default range max', function(done) {
1757+
expectForward(done, 7);
1758+
});
1759+
1760+
it('does not reverse axis when minallowed equals default range max', function(done) {
1761+
expectForward(done, 6);
1762+
});
1763+
1764+
it('does not reverse axis when minallowed is well above default range max', function(done) {
1765+
expectForward(done, 100);
1766+
});
1767+
1768+
it('keeps explicit autorange:reversed even when minallowed is set', function(done) {
1769+
Plotly.newPlot(gd, [{
1770+
x: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
1771+
y: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1772+
}], {
1773+
xaxis: { autorange: 'reversed', minallowed: 7 }
1774+
}).then(function() {
1775+
var r = gd._fullLayout.xaxis.range;
1776+
expect(r[0]).toBeGreaterThan(r[1], 'axis should remain reversed');
1777+
expect(r[1]).toBe(7, 'min slot (range[1] when reversed) should be minallowed');
1778+
}).then(done, done.fail);
1779+
});
1780+
1781+
it('does not reverse axis when maxallowed is below default range min', function(done) {
1782+
Plotly.newPlot(gd, [{
1783+
x: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
1784+
y: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1785+
}], {
1786+
xaxis: { maxallowed: -2 }
1787+
}).then(function() {
1788+
var r = gd._fullLayout.xaxis.range;
1789+
expect(r[0]).toBeLessThan(r[1], 'axis should not be reversed');
1790+
expect(r[1]).toBe(-2, 'axis max should be pinned at maxallowed');
1791+
}).then(done, done.fail);
1792+
});
1793+
});
1794+
17361795
describe('constraints relayout', function() {
17371796
var gd;
17381797

0 commit comments

Comments
 (0)