71 lines
1.6 KiB
JavaScript
71 lines
1.6 KiB
JavaScript
import {ticks, tickIncrement} from "d3-array";
|
|
import continuous, {copy} from "./continuous.js";
|
|
import {initRange} from "./init.js";
|
|
import tickFormat from "./tickFormat.js";
|
|
|
|
export function linearish(scale) {
|
|
var domain = scale.domain;
|
|
|
|
scale.ticks = function(count) {
|
|
var d = domain();
|
|
return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
|
|
};
|
|
|
|
scale.tickFormat = function(count, specifier) {
|
|
var d = domain();
|
|
return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
|
|
};
|
|
|
|
scale.nice = function(count) {
|
|
if (count == null) count = 10;
|
|
|
|
var d = domain();
|
|
var i0 = 0;
|
|
var i1 = d.length - 1;
|
|
var start = d[i0];
|
|
var stop = d[i1];
|
|
var prestep;
|
|
var step;
|
|
var maxIter = 10;
|
|
|
|
if (stop < start) {
|
|
step = start, start = stop, stop = step;
|
|
step = i0, i0 = i1, i1 = step;
|
|
}
|
|
|
|
while (maxIter-- > 0) {
|
|
step = tickIncrement(start, stop, count);
|
|
if (step === prestep) {
|
|
d[i0] = start
|
|
d[i1] = stop
|
|
return domain(d);
|
|
} else if (step > 0) {
|
|
start = Math.floor(start / step) * step;
|
|
stop = Math.ceil(stop / step) * step;
|
|
} else if (step < 0) {
|
|
start = Math.ceil(start * step) / step;
|
|
stop = Math.floor(stop * step) / step;
|
|
} else {
|
|
break;
|
|
}
|
|
prestep = step;
|
|
}
|
|
|
|
return scale;
|
|
};
|
|
|
|
return scale;
|
|
}
|
|
|
|
export default function linear() {
|
|
var scale = continuous();
|
|
|
|
scale.copy = function() {
|
|
return copy(scale, linear());
|
|
};
|
|
|
|
initRange.apply(scale, arguments);
|
|
|
|
return linearish(scale);
|
|
}
|