REVISED FIGURES AND INTERACTIVE PRESENTATIONS

Canonical numerical input: ../calculations/results.json.
The original dataset received only the explicitly authorized minimal repairs. This directory contains presentation outputs, not a separate mathematical fit. No coordinates were manually moved, averaged, rotated into a new basis, or recentered here.

REPORT FIGURES
PCA.png                  PCA axes1/2,1880x1280
Diffusion12.png          Diffusion axes1/2,1880x1280
Diffusion13.png          Diffusion axes1/3,1880x1280
Regional3D.png           Existing regional camera,960x580
DistanceMatrix.png       All20 full-distance matrix,2400x2200
Spread.png               All20 SDs excluding self/sister,1937x1767
Interactive.html         Native Page fragment, existing regional default
Qiraat_Diffusion_3D.html  Offline standalone cube, existing oblique default

PRESERVED PRESENTATION
The exact original Matplotlib generators were recovered. As a control, feeding the original inputs into the restored generators reproduced all FIVE original Matplotlib images byte-for-byte and pixel-for-pixel. See style_reproduction_check.json. The revised images retain those fonts, colors, markers, label offsets, sizes and axis limits. The matrix color scale and spread scale were also held fixed. Only the numerical data, required percentage/count labels, and position-following labels changed.

Both 3D formats preserve their entire original layout, camera, trace styling and three faint origin lines. Their five region traces and label/focus arrays contain the canonical repaired coordinates exactly. No centre-of18 or preserved-centre-distance control was added. The native Page fragment retains its original controls and widget-state behaviour; the standalone cube retains its original independent UI and bundled Plotly. Same coordinate units on each axis.

VALIDATION
- presentation_validation.json: all20 coordinates match exactly in both formats; layouts, trace styling and origin axes unchanged.
- DistanceMatrix_ocr_verification.json: all400 printed matrix cells match canonical repaired full distances rounded to2decimals.
- browser_validation.json: native and standalone rendering, selection, reset and axis-view controls; tested at desktop and mobile widths; no JavaScript errors.
- The six revised figures were visually inspected.

REPRODUCING
python build_figures.py
node render_regional.cjs
python check_raster_matrix.py
python verify_presentations.py

Python requires numpy, matplotlib, Pillow and tesseract on PATH for OCR. The renderer requires Node Playwright and a Chromium-family browser; set QIRAAT_CHROMIUM_PATH to an installed browser executable if needed. Without that variable, the renderer uses Playwright’s normal installed Chromium. The Playwright package is loaded through ordinary Node module resolution, with the hosted runtime module path as an optional fallback. The rendering check used Chrome Headless Shell154.0.8037.92. Native Plotly3.1.0 is vendored in source_templates for repeatable browser rendering. The standalone cube retains its original embedded Plotly4.1.1.

source_templates contains original generators, numerical plotting inputs, original images and original interactive templates. The optional check_original_style.py regenerates the original five scientific plots to verify exact style reproduction. The browser/screenshots under qa_* are verification aids and are not additional report figures.

PORTABLE FOLDER STRUCTURE
Keep figures/ beside calculations/, whose results.json is the single numerical input. Run the commands above from figures/. Source templates and original style-check inputs are included under source_templates/. No source data need to be fetched from another workspace. Install the Python dependencies in your environment and the Node playwright package; install its Chromium browser or set QIRAAT_CHROMIUM_PATH. System tesseract is required only for the optional OCR verification, not to generate figures. The external Chrome binary is not part of the data archive.
