Skip to content

Commit eca3da7

Browse files
committed
adapt autorange routine for axis breaks
... as the value-space length is reduced when axis breaks are present within the trial range
1 parent 259eafa commit eca3da7

File tree

2 files changed

+82
-2
lines changed

2 files changed

+82
-2
lines changed

src/plots/cartesian/autorange.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,26 @@ function getAutoRange(gd, ax) {
9595
// don't allow padding to reduce the data to < 10% of the length
9696
var minSpan = axLen / 10;
9797

98+
// find axis breaks in [v0,v1] and compute its length in value space
99+
var calcBreaksLength = function(v0, v1) {
100+
var lBreaks = 0;
101+
if(ax.breaks) {
102+
var breaksOut = ax.locateBreaks(v0, v1);
103+
for(var i = 0; i < breaksOut.length; i++) {
104+
lBreaks += (breaksOut[i].max - breaksOut[i].min);
105+
}
106+
}
107+
return lBreaks;
108+
};
109+
98110
var mbest = 0;
99111
var minpt, maxpt, minbest, maxbest, dp, dv;
100112

101113
for(i = 0; i < minArray.length; i++) {
102114
minpt = minArray[i];
103115
for(j = 0; j < maxArray.length; j++) {
104116
maxpt = maxArray[j];
105-
dv = maxpt.val - minpt.val;
117+
dv = maxpt.val - minpt.val - calcBreaksLength(minpt.val, maxpt.val);
106118
if(dv > 0) {
107119
dp = axLen - getPad(minpt) - getPad(maxpt);
108120
if(dp > minSpan) {
@@ -167,7 +179,7 @@ function getAutoRange(gd, ax) {
167179
}
168180

169181
// in case it changed again...
170-
mbest = (maxbest.val - minbest.val) /
182+
mbest = (maxbest.val - minbest.val - calcBreaksLength(minpt.val, maxpt.val)) /
171183
(axLen - getPad(minbest) - getPad(maxbest));
172184

173185
newRange = [

test/jasmine/tests/axes_test.js

+68
Original file line numberDiff line numberDiff line change
@@ -4214,6 +4214,74 @@ describe('Test axes', function() {
42144214
});
42154215
});
42164216

4217+
describe('during doAutorange', function() {
4218+
var gd;
4219+
4220+
beforeEach(function() {
4221+
gd = createGraphDiv();
4222+
});
4223+
4224+
afterEach(destroyGraphDiv);
4225+
4226+
function _assert(msg, exp) {
4227+
expect(gd._fullLayout.xaxis.range).toEqual(exp.xrng, msg + '| x range');
4228+
expect(gd._fullLayout.xaxis._lBreaks).toBe(exp.lBreaks, msg + '| lBreaks');
4229+
}
4230+
4231+
it('should adapt padding about axis breaks length', function(done) {
4232+
Plotly.plot(gd, [{
4233+
mode: 'markers',
4234+
x: [0, 10, 50, 90, 100, 150, 190, 200]
4235+
}], {
4236+
xaxis: {
4237+
breaks: [
4238+
{bounds: [11, 89]},
4239+
{bounds: [101, 189]}
4240+
]
4241+
}
4242+
})
4243+
.then(function() {
4244+
_assert('mode:markers (i.e. with padding)', {
4245+
xrng: [-2.1849529780564265, 202.18495297805643],
4246+
lBreaks: 166
4247+
});
4248+
})
4249+
.then(function() {
4250+
gd.data[0].mode = 'lines';
4251+
return Plotly.react(gd, gd.data, gd.layout);
4252+
})
4253+
.then(function() {
4254+
_assert('mode:lines (i.e. no padding)', {
4255+
xrng: [0, 200],
4256+
lBreaks: 166
4257+
});
4258+
})
4259+
.then(function() {
4260+
gd.data[0].mode = 'markers';
4261+
gd.layout.xaxis.breaks[0].enabled = false;
4262+
return Plotly.react(gd, gd.data, gd.layout);
4263+
})
4264+
.then(function() {
4265+
_assert('mode:markers | one of two breaks enabled', {
4266+
xrng: [-7.197492163009405, 207.1974921630094],
4267+
lBreaks: 88
4268+
});
4269+
})
4270+
.then(function() {
4271+
gd.layout.xaxis.breaks[1].enabled = false;
4272+
return Plotly.react(gd, gd.data, gd.layout);
4273+
})
4274+
.then(function() {
4275+
_assert('mode:markers | no breaks enabled', {
4276+
xrng: [-12.852664576802507, 212.8526645768025],
4277+
lBreaks: 0
4278+
});
4279+
})
4280+
.catch(failTest)
4281+
.then(done);
4282+
});
4283+
});
4284+
42174285
describe('during setConvert (once range is available)', function() {
42184286
var gd;
42194287

0 commit comments

Comments
 (0)