You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.3 KiB
51 lines
1.3 KiB
// Adapted from vega-statistics by Jeffrey Heer
|
|
// License: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/LICENSE
|
|
// Source: https://github.com/vega/vega/blob/f058b099decad9db78301405dd0d2e9d8ba3d51a/packages/vega-statistics/src/regression/points.js
|
|
export function points(data, x, y, sort) {
|
|
data = data.filter((d, i) => {
|
|
let u = x(d, i), v = y(d, i);
|
|
return u != null && isFinite(u) && v != null && isFinite(v);
|
|
});
|
|
|
|
if (sort) {
|
|
data.sort((a, b) => x(a) - x(b));
|
|
}
|
|
|
|
const n = data.length,
|
|
X = new Float64Array(n),
|
|
Y = new Float64Array(n);
|
|
|
|
// extract values, calculate means
|
|
let ux = 0, uy = 0, xv, yv, d;
|
|
for (let i = 0; i < n; ) {
|
|
d = data[i];
|
|
X[i] = xv = +x(d, i, data);
|
|
Y[i] = yv = +y(d, i, data);
|
|
++i;
|
|
ux += (xv - ux) / i;
|
|
uy += (yv - uy) / i;
|
|
}
|
|
|
|
// mean center the data
|
|
for (let i = 0; i < n; ++i) {
|
|
X[i] -= ux;
|
|
Y[i] -= uy;
|
|
}
|
|
|
|
return [X, Y, ux, uy];
|
|
}
|
|
|
|
|
|
export function visitPoints(data, x, y, cb){
|
|
let iterations = 0;
|
|
|
|
for (let i = 0, n = data.length; i < n; i++) {
|
|
const d = data[i],
|
|
dx = +x(d, i, data),
|
|
dy = +y(d, i, data);
|
|
|
|
if (dx != null && isFinite(dx) && dy != null && isFinite(dy)) {
|
|
cb(dx, dy, iterations++);
|
|
}
|
|
}
|
|
}
|
|
|