TanStack
Getting Started

Compare Libraries

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.

Tested versions

LibraryPackageMeasured source
TanStack Charts@tanstack/chartsworkspace 1a8b888
Chart.jschart.jsnpm 4.5.1
Apache EChartsechartsnpm 6.1.0
Rechartsrechartsnpm 3.10.1
Observable Plot@observablehq/plotnpm 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.

Capability matrix

  • βœ… Documented first-party component or API
  • 🟑 Requires application composition, an external package, or explicit lifecycle work
  • πŸ”΄ No documented first-party path

β€œ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.

LibraryAxes and gridLegendPointer tooltipMulti-seriesSelectionAnimationResponsive resizeEvidence
TanStack Chartsβœ… Built inβœ… Built inβœ… Built inβœ… Built inβœ… onSelectβœ… Built inβœ… ObservedMeasured
D3βœ… Modules🟑 Authored🟑 Authoredβœ… Primitivesβœ… Brush and eventsβœ… Transitions🟑 Host layoutDocs
Chart.jsβœ… Built inβœ… Pluginβœ… Pluginβœ… Datasetsβœ… Event APIβœ… Built inβœ… ObservedMeasured
Apache EChartsβœ… Componentsβœ… Componentβœ… Componentβœ… Seriesβœ… Event APIβœ… Built in🟑 Explicit resize()Measured
Rechartsβœ… Componentsβœ… Componentβœ… Componentβœ… Componentsβœ… Event propsβœ… Built inβœ… ResponsiveContainerMeasured
visxβœ… Componentsβœ… Componentβœ… Componentβœ… Primitivesβœ… Brush🟑 Externalβœ… ParentSizeDocs
Plotly.jsβœ… Built inβœ… Built inβœ… Built inβœ… Traces and subplotsβœ… Box and lassoβœ… Built inβœ… Responsive configDocs
Lightweight Chartsβœ… Built in🟑 Host🟑 Hostβœ… Series🟑 Events and hostπŸ”΄ No transitionsβœ… autoSizeDocs
ApexChartsβœ… Built inβœ… Built inβœ… Built inβœ… Seriesβœ… Point and rangeβœ… Built inβœ… BreakpointsDocs
Nivoβœ… Componentsβœ… Componentβœ… Componentβœ… Seriesβœ… Event propsβœ… React Springβœ… Responsive componentsDocs
Highchartsβœ… Built inβœ… Built inβœ… Built inβœ… Seriesβœ… Point and rangeβœ… Built inβœ… ReflowDocs
Victoryβœ… Componentsβœ… Componentβœ… Componentβœ… Componentsβœ… Events and containersβœ… animateβœ… Responsive containerDocs
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 sizingDocs
Observable Plotβœ… Marks and scalesβœ… Legend APIβœ… Tip markβœ… Marks and transforms🟑 Host composition🟑 Host-owned🟑 Host rerenderMeasured
Bklit UIβœ… Componentsβœ… Componentβœ… Componentβœ… ComposedChartβœ… Brushβœ… Motionβœ… Container measureDocs
AG Chartsβœ… Componentsβœ… Componentβœ… Componentβœ… Seriesβœ… Enterpriseβœ… Enterpriseβœ… Auto-sizeDocs

License color:

  • 🟒 Permissive open source; commercial use allowed
  • 🟑 Open core or mixed open/proprietary offering
  • 🟠 Commercial use is conditional or revenue-limited
  • πŸ”΄ Paid license required for commercial use
LibrarySVG outputCanvas or WebGL outputFramework-neutral coreLicense / 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.

Bundle snapshot

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.

LibraryBundle sizeReact externalizedEvidence
TanStack Charts26.65–32.14 KiBβ€”Controlled suite
D390 KB gzipβ€”External main export
Chart.js44.70–58.21 KiBβ€”Controlled suite
Apache ECharts153.10–173.18 KiBβ€”Controlled suite
Recharts153.08–168.27 KiB94.96–109.96 KiBControlled suite
visx49 KB gzipβ€”External @visx/xychart main export
Plotly.js~250 kB partial; ~3.6 MB full min+gzipβ€”Vendor distribution figures
Lightweight Charts60 KB gzipβ€”External main export
ApexCharts164 KB gzipβ€”External main export
Nivo143 KB gzipβ€”External main export
Highcharts100 KB gzipβ€”External main export
Victory105 KB gzipβ€”External main export
uPlot22 KB gzipβ€”External uplot@1.6.32 main export
Vega-Lite87 KB gzipβ€”External vega-lite@6.4.3; excludes the peer Vega runtime
Observable Plot83.34–91.94 KiBβ€”Controlled suite
Bklit UIβ€”β€”Registry-installed source; no fixed package bundle
AG Charts367 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.

Broader conformance

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:

ResponsibilityOwner
Binning, grouping, stacking, and statisticsHoistable TanStack transforms or granular D3 modules
Spatial layoutsApplication code using a suitable layout library
Brush, zoom, scrubber, and editor stateApplication state and optional D3 behavior
Data fetching, cleaning, filtering, and persistenceThe 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.

Evidence and reproduction

shell
pnpm benchmark:size
pnpm benchmark:check
pnpm benchmark:stress:quick
pnpm conformance:quick

The 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.