UNPKG

@thi.ng/viz

Version:

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

68 lines (67 loc) 1.95 kB
import { inRange } from "@thi.ng/math/interval"; import { mix } from "@thi.ng/math/mix"; import { mergeDeepObj } from "@thi.ng/object-utils/merge-deep"; import { comp } from "@thi.ng/transducers/comp"; import { filter } from "@thi.ng/transducers/filter"; import { iterator } from "@thi.ng/transducers/iterator"; import { map } from "@thi.ng/transducers/map"; import { range } from "@thi.ng/transducers/range"; import { range2d } from "@thi.ng/transducers/range2d"; import { axisDefaults } from "./common.js"; const log = (base) => { const lb = 1 / Math.log(base); return (x) => x > 0 ? Math.log(x) * lb : x < 0 ? -Math.log(-x) * lb : 0; }; const logScale__ = ([d1, d2], [r1, r2], base = 10) => { const $ = log(base); const dr = 1 / $(d2 - d1 + 1); return (x) => mix(r1, r2, $(x - d1 + 1) * dr); }; const logScale = ([d1, d2], [r1, r2], base = 10) => { const $ = log(base); const d11 = $(d1); const d3 = $(d2) - d11; return (x) => mix(r1, r2, ($(x) - d11) / d3); }; const logAxis = (src) => { const spec = mergeDeepObj(axisDefaults({ base: 10 }), src); !spec.scale && (spec.scale = logScale(spec.domain, spec.range, spec.base)); return spec; }; const logDomain = (d1, d2, base) => { const $ = log(base); return [Math.floor($(d1)), Math.ceil($(d2))]; }; const logTicksMajor = (base = 10) => ([d1, d2]) => { const [d1l, d2l] = logDomain(d1, d2, base); return [ ...iterator( comp( map((x) => Math.pow(base, x)), filter((x) => inRange(x, d1, d2)) ), range(d1l, d2l + 1) ) ]; }; const logTicksMinor = (base = 10) => ([d1, d2]) => { const [d1l, d2l] = logDomain(d1, d2, base); return [ ...iterator( comp( map(([m, n]) => m * Math.pow(base, n) / base), filter((x) => inRange(x, d1, d2)) ), range2d(1, base, d1l, d2l + 1) ) ]; }; export { log, logAxis, logDomain, logScale, logScale__, logTicksMajor, logTicksMinor };