TanStack Charts 0.4.0 is a pre-alpha release. Its results on this page measure the current workspace source and pinned competitor packages. This comparison records architectural differences and reproducible evidence without turning untested behavior into a checkmark.
| Library | Package | Measured source |
|---|---|---|
| TanStack Charts | @tanstack/charts | workspace 1a8b888 |
| Chart.js | chart.js | npm 4.5.1 |
| Apache ECharts | echarts | npm 6.1.0 |
| Recharts | recharts | npm 3.10.1 |
| Observable Plot | @observablehq/plot | npm 0.6.17 |
The competitor versions are exact package pins, not latest versions inferred at page render time. The measured TanStack workspace revision is 1a8b888.
βMeasuredβ libraries are installed at the pinned versions above and exercised by the controlled suite. βDocsβ entries are reviewed against the linked official documentation and carry no bundle or performance claim. Library rows are sorted by GitHub repository stars read on 2026-07-31, with TanStack Charts pinned first. Stars are an ordering key, not an adoption measure.
| Library | Axes and grid | Legend | Pointer tooltip | Multi-series | Selection | Animation | Responsive resize | Evidence |
|---|---|---|---|---|---|---|---|---|
| TanStack Charts | β Built in | β Built in | β Built in | β Built in | β onSelect | β Built in | β Observed | Measured |
| D3 | β Modules | π‘ Authored | π‘ Authored | β Primitives | β Brush and events | β Transitions | π‘ Host layout | Docs |
| Chart.js | β Built in | β Plugin | β Plugin | β Datasets | β Event API | β Built in | β Observed | Measured |
| Apache ECharts | β Components | β Component | β Component | β Series | β Event API | β Built in | π‘ Explicit resize() | Measured |
| Recharts | β Components | β Component | β Component | β Components | β Event props | β Built in | β ResponsiveContainer | Measured |
| visx | β Components | β Component | β Component | β Primitives | β Brush | π‘ External | β ParentSize | Docs |
| Plotly.js | β Built in | β Built in | β Built in | β Traces and subplots | β Box and lasso | β Built in | β Responsive config | Docs |
| Lightweight Charts | β Built in | π‘ Host | π‘ Host | β Series | π‘ Events and host | π΄ No transitions | β autoSize | Docs |
| ApexCharts | β Built in | β Built in | β Built in | β Series | β Point and range | β Built in | β Breakpoints | Docs |
| Nivo | β Components | β Component | β Component | β Series | β Event props | β React Spring | β Responsive components | Docs |
| Highcharts | β Built in | β Built in | β Built in | β Series | β Point and range | β Built in | β Reflow | Docs |
| Victory | β Components | β Component | β Component | β Components | β Events and containers | β animate | β Responsive container | Docs |
| uPlot | β Built in | β Built in | π‘ Plugin or host | β Series | β Cursor and select | π΄ No transitions | π‘ setSize() | Docs |
| Vega-Lite | β Guides | β Built in | β Encoding | β Layers and views | β Parameters | π‘ Vega or host | β Container sizing | Docs |
| Observable Plot | β Marks and scales | β Legend API | β Tip mark | β Marks and transforms | π‘ Host composition | π‘ Host-owned | π‘ Host rerender | Measured |
| Bklit UI | β Components | β Component | β Component | β ComposedChart | β Brush | β Motion | β Container measure | Docs |
| AG Charts | β Components | β Component | β Component | β Series | β Enterprise | β Enterprise | β Auto-size | Docs |
License color:
| Library | SVG output | Canvas or WebGL output | Framework-neutral core | License / paid tier |
|---|---|---|---|---|
| TanStack Charts | β Default | β Optional renderer | β Core + adapters | π’ MIT |
| D3 | β Yes | β Yes | β Yes | π’ ISC |
| Chart.js | π΄ Canvas only | β Default | β Yes | π’ MIT |
| Apache ECharts | β Optional renderer | β Default | β Yes | π’ Apache-2.0 |
| Recharts | β Default | π΄ No first-party renderer | π΄ React only | π’ MIT |
| visx | β Default | π΄ No renderer | π΄ React only | π’ MIT |
| Plotly.js | β Common traces | β WebGL traces | β Yes | π’ MIT |
| Lightweight Charts | π΄ No renderer | β Default | β Yes | π’ Apache-2.0 |
| ApexCharts | β Default | π΄ No renderer | β Yes | π Free under $2M revenue; commercial or OEM otherwise |
| Nivo | β Default | β Selected charts | π΄ React only | π’ MIT |
| Highcharts | β Default | β Boost WebGL | β Yes | π΄ Commercial; separate non-commercial terms |
| Victory | β Web | β Native Skia | π΄ React only | π’ MIT |
| uPlot | π΄ No renderer | β Default | β Yes | π’ MIT |
| Vega-Lite | β Yes | β Canvas | β Yes | π’ BSD-3-Clause |
| Observable Plot | β Default | π΄ No first-party renderer | β Yes | π’ ISC |
| Bklit UI | β Default | π΄ No renderer | π΄ React only | π‘ MIT components; proprietary Studio |
| AG Charts | π΄ No renderer | β Default | β Yes | π‘ MIT Community; paid Enterprise |
A checkmark means the named path exists; it does not claim identical defaults, accessibility, output, or performance.
The standard suite exercises axes, guides, tooltips, legends, and multi-series composition. Selection, animation, and resize paths are recorded but excluded from timing. Renderer and framework rows follow each package's documented output model.
Baseline date: 2026-08-01.
Controlled ranges cover 12 independently built, minified browser consumers: line, bar, area, and scatter at basic, interactive, and advanced tiers. Only Recharts has a separate incremental result because that lane externalizes React and React DOM.
External figures are not comparable to the controlled cold-page ranges. Most come from a Bundlephobia main-export snapshot published on July 7, 2026. The Vega-Lite, AG Charts, and uPlot main exports were read from Bundlephobia on July 31, 2026. Modular imports can be smaller, especially for AG Charts.
| Library | Bundle size | React externalized | Evidence |
|---|---|---|---|
| TanStack Charts | 26.65β32.14 KiB | β | Controlled suite |
| D3 | 90 KB gzip | β | External main export |
| Chart.js | 44.70β58.21 KiB | β | Controlled suite |
| Apache ECharts | 153.10β173.18 KiB | β | Controlled suite |
| Recharts | 153.08β168.27 KiB | 94.96β109.96 KiB | Controlled suite |
| visx | 49 KB gzip | β | External @visx/xychart main export |
| Plotly.js | ~250 kB partial; ~3.6 MB full min+gzip | β | Vendor distribution figures |
| Lightweight Charts | 60 KB gzip | β | External main export |
| ApexCharts | 164 KB gzip | β | External main export |
| Nivo | 143 KB gzip | β | External main export |
| Highcharts | 100 KB gzip | β | External main export |
| Victory | 105 KB gzip | β | External main export |
| uPlot | 22 KB gzip | β | External uplot@1.6.32 main export |
| Vega-Lite | 87 KB gzip | β | External vega-lite@6.4.3; excludes the peer Vega runtime |
| Observable Plot | 83.34β91.94 KiB | β | Controlled suite |
| Bklit UI | β | β | Registry-installed source; no fixed package bundle |
| AG Charts | 367 KB gzip | β | External ag-charts-community@14.0.2 main export |
The tracked baseline distinguishes the TanStack workspace revision from competitor package versions and records the complete chart/tier matrix; the deterministic bundle gate rejects either kind of drift.
The table does not report install size or runtime speed. The controlled comparison builds the current TanStack workspace source and the pinned competitor packages. Browser timing is meaningful only within one machine and browser run, so this page does not publish a cross-machine timing leaderboard.
The catalog corpus contains 100 TanStack/reference pairs: 68 sourced from Observable Plot, 21 from Recharts, and 11 from Apache ECharts. Sixteen pairs carry executable interaction scenarios. Those counts describe selected reference coverage, not each library's feature ceiling or a list of built-in TanStack chart types. Chart.js participates in the standard and stress suites, not the catalog corpus.
The catalog displays each renderer entry, its transitive support and transform files, and provenance for imported demo datasets. Its report counts the complete authored source closure and publishes the source-line ratio for every pair; moving a transform or layout into a support module does not remove it from the comparison, while raw snapshot rows are not treated as chart authoring.
TanStack deliberately keeps several responsibilities outside the default runtime:
| Responsibility | Owner |
|---|---|
| Binning, grouping, stacking, and statistics | Hoistable TanStack transforms or granular D3 modules |
| Spatial layouts | Application code using a suitable layout library |
| Brush, zoom, scrubber, and editor state | Application state and optional D3 behavior |
| Data fetching, cleaning, filtering, and persistence | The application's data and state layers |
Choose Chart.js when Canvas-first standard charts and its plugin ecosystem fit the application. Choose Apache ECharts for a broad built-in controller and chart catalog with Canvas or SVG output. Choose Recharts for a React-native SVG component model. Choose Observable Plot for concise exploratory marks and transforms. Choose TanStack Charts when one typed, framework-independent definition must grow from standard charts into application-specific SVG or Canvas composition while keeping D3 and state ownership explicit.
pnpm benchmark:size
pnpm benchmark:check
pnpm benchmark:stress:quick
pnpm conformance:quickThe browser-backed commands require the pinned Playwright browser. Read the bundle and performance guide before interpreting results, and use the migration guide to establish application-specific parity before replacing an existing library.