@thi.ng/viz
Version:
Declarative, functional & multi-format data visualization toolkit based around @thi.ng/hiccup
39 lines (38 loc) • 1.57 kB
JavaScript
import { ensureArray } from "@thi.ng/arrays/ensure-array";
import { mix } from "@thi.ng/math/mix";
import { map } from "@thi.ng/transducers/map";
import { max } from "@thi.ng/transducers/max";
import { min } from "@thi.ng/transducers/min";
import { minMax } from "@thi.ng/transducers/min-max";
import { transduce } from "@thi.ng/transducers/transduce";
const uniformDomain = (src) => {
const vals = ensureArray(src);
return ([d1, d2]) => {
const norm = vals.length > 1 ? 1 / (vals.length - 1) : 0;
return vals.map((x, i) => [mix(d1, d2, i * norm), x]);
};
};
const dataBounds = (fn, src, pad = 0) => {
const b = transduce(map(fn), minMax(), src);
b[0] -= pad;
b[1] += pad;
return b;
};
const dataBounds2 = (min2, max2, src, padMin = 0, padMax = padMin) => [dataMin(min2, src, padMin), dataMax(max2, src, padMax)];
const dataMin = (fn, src, pad = 0) => transduce(map(fn), min(), src) - pad;
const dataMax = (fn, src, pad = 0) => transduce(map(fn), max(), src) + pad;
const dataMinLog = (fn, src, base = 10) => Math.pow(base, Math.floor(Math.log(dataMin(fn, src)) / Math.log(base)));
const dataMaxLog = (fn, src, base = 10) => Math.pow(base, Math.ceil(Math.log(dataMax(fn, src)) / Math.log(base)));
const dataBoundsLog = (fn, src, base) => [dataMinLog(fn, src, base), dataMaxLog(fn, src, base)];
const dataBounds2Log = (min2, max2, src, base = 10) => [dataMinLog(min2, src, base), dataMaxLog(max2, src, base)];
export {
dataBounds,
dataBounds2,
dataBounds2Log,
dataBoundsLog,
dataMax,
dataMaxLog,
dataMin,
dataMinLog,
uniformDomain
};