|
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); |
|
} |
|
|