@paulrobins/wafermap vs Plotly.js

Rendering the same wafer data in both libraries. Timings from performance.now() — data fetch excluded.

Click Run to load data and time both renders. Click again for a warmer run.
@paulrobins/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 @paulrobins/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 colour ✓ Native — blue/red overlay ✗ 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