Click Run to load data and time both renders. Click again for a warmer run.
@wafertools/wafermap ~85 KB gzip (full stack)
buildWaferMap() —
renderWaferMap() —
Total —
Plotly.js ~1.1 MB gzip (full bundle)
Data preparation —
Plotly.newPlot() (awaited) —
Total —
First run timings include JS engine warm-up. Click Run benchmark again for more representative numbers.

## Feature comparison

What each library handles natively vs what requires manual implementation.

Feature | @wafertools/wafermap | Plotly.js
--- | --- | ---
Geometry
Circular wafer boundary | ✓ NativeComputed from die pitch and wafer diameter | △ Shape overlay onlyCircle drawn on top — dies outside are not clipped
Die coordinates → wafer grid | ✓ NativeProber step positions accepted directly | △ Manualx/y used as scatter coordinates; no grid semantics
Die pitch and sizing | ✓ Inferred automatically | ✗ Fixed pixel marker sizeGaps or overlaps depending on zoom
Edge exclusion ring | ✓ Native | ✗ Manual pre-filter
Wafer notch / orientation | ✓ Native (rotate, flip) | ✗ Manual coordinate transform
Data handling
Hard bin (categorical pass/fail) | ✓ Native — named, colour-mapped | △ Numeric colorscale onlyNo bin names, no pass/fail semantics
Soft bin mode | ✓ Native | ✗ Separate manual trace
Multiple test values per die | ✓ Native — test selector in toolbar | ✗ One value per trace; manual UI to switch
Spec limits + out-of-spec flagging | ✓ Native — ▽/△ markers | ✗ Manual pre-classification
Retest policy (best / worst / last) | ✓ Native | ✗ Manual pre-process
Interactivity
In-map toolbar (end-user configurable) | ✓ NativeAlways-visible toolbar (top-right). Does everything Plotly's modebar does — zoom, pan, box-select, save image — plus live wafer config: plot mode & test, colour scheme, overlays (rings, quadrants, axes, reticle, spec pass/fail), legend position, rotate/flip — all with no code | △ Modebar onlyZoom, pan, select, export. Colours, overlays and layout require code changes and a re-render
Zoom / pan | ✓ | ✓
Die tooltip | ✓ Native — bin, soft bin, all test values | △ Custom templateOnly values passed to the trace
Box-select → sub-region yield | ✓ Native | ✗ Manual selected-point callback
PNG export | ✓ Toolbar button | ✓ Modebar button
Analysis
Ring yield differential | ✓ Built-in (analyzeWaferMap) | ✗ Not available
Failure cluster detection | ✓ Built-in | ✗ Not available
Quadrant / sector analysis | ✓ Built-in | ✗ Not available
Reticle / stepper overlay | ✓ Built-in | ✗ Not available
Lot-level gallery + findings | ✓ Built-in (renderWaferGallery + analyzeWaferLot) | ✗ Manual layout + no lot analysis
Integration
Library size (gzip) | ~85 KB (full stack) | ~1.1 MB (full bundle)~300 KB with plotly-basic (no WebGL)
Zero runtime dependencies | ✓ | ✓
React / Vue / Svelte / vanilla JS | ✓ | ✓
Web Worker support | ✓ (buildWaferMap runs off main thread) | ✗
Lines of code (basic wafer map) | 2 | ~25–30Scatter trace + layout + circle shape + color mapping