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}