@thi.ng/viz
Version: 
Declarative, functional & multi-format data visualization toolkit based around @thi.ng/hiccup
68 lines (67 loc) • 1.95 kB
JavaScript
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
};