plot.js

2.2 kB · javascript · 69 lines

1// RANGES23function span(values, n) {4  let lo = Number.MAX_VALUE;5  let hi = -Number.MAX_VALUE;6  for (let i = 0; i < n; i++) {7    if (values[i] < lo) lo = values[i];8    if (values[i] > hi) hi = values[i];9  }10  return hi - lo < 1e-12 ? [lo - 0.5, hi + 0.5] : [lo, hi];11}1213// MARKS1415export function bars(pen, frame, values, gap, color) {16  if (values.length === 0) return;17  let peak = 0;18  for (let i = 0; i < values.length; i++) if (Math.abs(values[i]) > peak) peak = Math.abs(values[i]);19  if (peak <= 0) return;20  const slot = frame.w / values.length;21  const pad = (gap * slot) / 2;22  for (let i = 0; i < values.length; i++) {23    const h = frame.h * (Math.abs(values[i]) / peak);24    pen.rect(frame.x + i * slot + pad, frame.y + frame.h - h, slot - 2 * pad, h, color);25  }26}2728export function dots(pen, pts, r, color) {29  for (const [x, y] of pts) pen.disc(x, y, r, color);30}3132export function rings(pen, center, radii, thick, color) {33  for (const r of radii) pen.ring(center[0], center[1], r, thick, color);34}3536export function staircase(pen, frame, values, thick, color) {37  if (values.length === 0) return;38  const [lo, hi] = span(values, values.length);39  const slot = frame.w / values.length;40  const pts = [];41  for (let i = 0; i < values.length; i++) {42    const y = frame.y + frame.h * (1 - (values[i] - lo) / (hi - lo));43    pts.push([frame.x + i * slot, y], [frame.x + (i + 1) * slot, y]);44  }45  pen.polyline(pts, thick, color);46}4748export function curve(pen, frame, xs, ys, thick, color) {49  const n = Math.min(xs.length, ys.length);50  if (n < 2) return;51  const [xlo, xhi] = span(xs, n);52  const [ylo, yhi] = span(ys, n);53  const pts = [];54  for (let i = 0; i < n; i++) {55    pts.push([frame.x + (frame.w * (xs[i] - xlo)) / (xhi - xlo), frame.y + frame.h * (1 - (ys[i] - ylo) / (yhi - ylo))]);56  }57  pen.polyline(pts, thick, color);58}5960export function axis(pen, frame, color) {61  const thick = Math.max(Math.min(frame.w, frame.h) / 512, 1);62  const { x, y, w, h } = frame;63  pen.polyline([[x, y], [x + w, y], [x + w, y + h], [x, y + h], [x, y]], thick, color);64}6566export function baseline(pen, frame, color) {67  const thick = Math.max(Math.min(frame.w, frame.h) / 512, 1);68  pen.segment([frame.x, frame.y + frame.h], [frame.x + frame.w, frame.y + frame.h], thick, color);69}