UNPKG

@thi.ng/viz

Version:

Declarative, functional & multi-format data visualization toolkit based around @thi.ng/hiccup

39 lines (38 loc) 1.57 kB
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 };