Scientific visualization built on a single idea: everything is a scatter plot.
A line plot, a pseudocolour map, a 3-D surface — they're all just points placed in a space, with visual properties (position, colour, size, opacity…) driven by data. Seurat is an editor for that mapping: drag any data dimension onto any visual channel and see what falls out.
There are two worlds:
- Data (D) — your dataset's coordinates (
lat,depth,time…) and values (temperature,porosity…), shown in orange. - Visual (V) — the scene's channels:
x, y, z, colourR/G/B/A,size,blur,jitter, …, shown in blue.
Drag a data item onto a visual channel to map it. Nothing is special — any D
can drive any V, even in strange ways. A scatter map is x→x, y→y, value→colour; lift the value onto z and it becomes a manifold; the same
engine does both.
- Load Zarr v3 datasets — a bundled sample, or open a local
.zarrfolder (no upload; read straight from disk in Chrome). - Map coordinates/values to position, colour (independent R/G/B, or a
cubehelix colourmap with live
start/rots/hue/gammaknobs), size, opacity, blur, and jitter (the last three for encoding uncertainty). - Per-channel distribution histograms, clipping (incl. 95/97/99th percentile), and transforms (log / sqrt).
- Binning into an aggregated heatmap grid (mean/max/min), to handle dense data and overplotting.
- Fog, a red/cyan 3-D (anaglyph) view, and independent or shared (true-aspect) axis scaling.
Requires Node ≥ 20.
npm install
npm run devOpen the printed localhost URL in Chrome.
The app reads Zarr stores from public/data/ (git-ignored). Generate the
bundled samples from the sibling zarr-tmp project:
cd ../zarr-tmp
uv run python make_map.py # → public/data/surface.zarr (a 2-D map)
uv run python make_log.py # → public/data/wireline_log.zarr (a 1-D log)Or click Open folder… in the app to load any consolidated Zarr v3 store of your own.
- Pick a dataset (or Open folder…). Its coordinates and values appear in the orange Data column.
- Drag a data item onto a channel in the blue Visual column. The view updates live; the channel shows the variable, and the data chip shades to show it's in use.
- Click a bound channel to open its mapping view — histogram, clip bounds, transform. Drag the colourmap swatch's source to colour by a variable.
- Toggle binning for a heatmap; orbit/scroll to navigate; try fog and 3-D.
Early and evolving. The design rationale lives in
OUTLINE.organized.md; the roadmap and what's done is in
PLAN.md.
Stack and the reasons behind it are documented in OUTLINE §7. In short: Vite + Svelte + TypeScript, Three.js for rendering, zarrita.js for Zarr, fully client-side. Common commands:
npm run dev # dev server with HMR
npm run build # production build
npm run check # svelte-check + tsc type check