Skip to content

Commit 0a55cc8

Browse files
authoredJul 30, 2020
Merge pull request #210 from domoritz/fix-nice
Ensure that niced domains always span ticks
2 parents d0a2fe4 + da99948 commit 0a55cc8

File tree

2 files changed

+54
-26
lines changed

2 files changed

+54
-26
lines changed
 

‎src/linear.js

+24-26
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,36 @@ export function linearish(scale) {
1919
scale.nice = function(count) {
2020
if (count == null) count = 10;
2121

22-
var d = domain(),
23-
i0 = 0,
24-
i1 = d.length - 1,
25-
start = d[i0],
26-
stop = d[i1],
27-
step;
22+
var d = domain();
23+
var i0 = 0;
24+
var i1 = d.length - 1;
25+
var start = d[i0];
26+
var stop = d[i1];
27+
var prestep;
28+
var step;
29+
var maxIter = 10;
2830

2931
if (stop < start) {
3032
step = start, start = stop, stop = step;
3133
step = i0, i0 = i1, i1 = step;
3234
}
33-
34-
step = tickIncrement(start, stop, count);
35-
36-
if (step > 0) {
37-
start = Math.floor(start / step) * step;
38-
stop = Math.ceil(stop / step) * step;
35+
36+
while (maxIter-- > 0) {
3937
step = tickIncrement(start, stop, count);
40-
} else if (step < 0) {
41-
start = Math.ceil(start * step) / step;
42-
stop = Math.floor(stop * step) / step;
43-
step = tickIncrement(start, stop, count);
44-
}
45-
46-
if (step > 0) {
47-
d[i0] = Math.floor(start / step) * step;
48-
d[i1] = Math.ceil(stop / step) * step;
49-
domain(d);
50-
} else if (step < 0) {
51-
d[i0] = Math.ceil(start * step) / step;
52-
d[i1] = Math.floor(stop * step) / step;
53-
domain(d);
38+
if (step === prestep) {
39+
d[i0] = start
40+
d[i1] = stop
41+
return domain(d);
42+
} else if (step > 0) {
43+
start = Math.floor(start / step) * step;
44+
stop = Math.ceil(stop / step) * step;
45+
} else if (step < 0) {
46+
start = Math.ceil(start * step) / step;
47+
stop = Math.floor(stop * step) / step;
48+
} else {
49+
break;
50+
}
51+
prestep = step;
5452
}
5553

5654
return scale;

‎test/linear-test.js

+30
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,36 @@ tape("linear.ticks(count) returns the expected ticks for a polylinear domain", f
373373
test.end();
374374
});
375375

376+
tape("linear.ticks(X) spans linear.nice(X).domain()", function(test) {
377+
function check(domain, count) {
378+
var s = scale.scaleLinear().domain(domain).nice(count);
379+
var ticks = s.ticks(count);
380+
test.deepEqual([ticks[0], ticks[ticks.length - 1]], s.domain());
381+
}
382+
383+
check([1, 9], 2);
384+
check([1, 9], 3);
385+
check([1, 9], 4);
386+
387+
check([8, 9], 2);
388+
check([8, 9], 3);
389+
check([8, 9], 4);
390+
391+
check([1, 21], 2);
392+
check([2, 21], 2);
393+
check([3, 21], 2);
394+
check([4, 21], 2);
395+
check([5, 21], 2);
396+
check([6, 21], 2);
397+
check([7, 21], 2);
398+
check([8, 21], 2);
399+
check([9, 21], 2);
400+
check([10, 21], 2);
401+
check([11, 21], 2);
402+
403+
test.end();
404+
})
405+
376406
tape("linear.ticks(count) returns the empty array if count is not a positive integer", function(test) {
377407
var s = scale.scaleLinear();
378408
test.deepEqual(s.ticks(NaN), []);

0 commit comments

Comments
 (0)
Please sign in to comment.