function spacedJitter(
data,
getX,
yRange,
{ random = Math.random, iterations = 20, edgeSpacing = 0 } = {}
) {
const yStart = yRange[0];
const ySize = yRange[1] - yRange[0];
const _data = data.map((d, i) => ({
x: getX(d),
y: yStart + random() * ySize,
index: i,
datum: d
}));
_data.sort((a, b) => a.x - b.x);
for (let i = 0; i < iterations; i++) {
for (let j = 0; j < _data.length; j++) {
const index = getRandomInt(0, _data.length, random);
const d = _data[index];
const distanceFromNearestPoint = distance(
index,
d.y,
yRange,
edgeSpacing,
_data
);
const candidateY = yStart + random() * ySize;
if (
distance(index, candidateY, yRange, edgeSpacing, _data) >
distanceFromNearestPoint
) {
d.y = candidateY;
}
}
}
_data.sort((a, b) => a.index - b.index);
for (const d of _data) {
delete d.index;
}
return _data;
}