React Chart Libraries: The Complete Comparison Guide

If your company clears $2 million in revenue and someone on your team ran npm install apexcharts, you’re on a paid license now. That change is recent enough that plenty of comparison posts still list ApexCharts as MIT.

Which is a decent illustration of why React chart libraries are harder to swap than they look. The wrong pick locks you into a rendering ceiling, or an invoice nobody budgeted for.

Ten are compared below: Recharts, Chart.js, Nivo, ApexCharts, Apache ECharts, visx, Victory, MUI X Charts, Highcharts, and Tremor.

React Chart Libraries

Ordered by how many teams they realistically serve, broadest default first and most specialized last.

Rendering model is the first fork in the road. Pick that before you pick a package.

Rendering Model Handles Comfortably Options Below
SVG Under ~10,000 points Recharts, Nivo, Victory, visx, MUI X
Canvas 10,000 to 100,000 points Chart.js, ApexCharts, ECharts
Canvas + WebGL 100,000+ points Apache ECharts, MUI X Premium

The rest of the field is covered in our wider roundup of JavaScript charting libraries if React isn’t a hard requirement, and the broader rendering approach comparison sits alongside it.

A note on the download figures below. They aren’t directly comparable, and it’s worth knowing why before you read too much into any of them. Some libraries ship as one installable package, others split across many.

Nivo, for instance, has no single nivo package at all: you install @nivo/core plus one scoped package per chart type, so @nivo/core is the only sensible proxy for its real usage.

Recharts, meanwhile, arrives as a transitive dependency inside several React UI kits, which inflates its count well past deliberate adoption. Figures below name the package they measure. Treat them as rough popularity signals, not rankings.

Recharts – Best for teams that want a React-native default and no debate

Recharts - Best for teams that want a React-native default and no debate

Recharts is composable SVG charting built on D3 submodules. Charts get assembled from JSX children rather than config objects, which is why it feels like the rest of your codebase.

Best for SaaS product teams building line, bar, and area dashboards.

What you get:

  • SVG rendering with a responsive container
  • Custom tooltip components
  • TypeScript types shipped in-package
  • Around 15 chart types

Pricing: Free, MIT.

Where it wins:

  • The largest React-first community in the category, with roughly 27k GitHub stars on the recharts package. Weekly npm downloads run in the tens of millions, though that figure is heavily inflated by Recharts arriving as a transitive dependency inside many React UI kits, so it overstates deliberate adoption by a wide margin
  • Lightweight D3 submodule imports instead of full D3

Where it falls short:

  • SVG bogs down past ~10k points
  • Advanced customization (custom tick renderers, active shape renderers) still forces occasional casts to any

Field note: shadcn/ui charts wrap Recharts, so a lot of teams already ship it without realizing. Check your lockfile before adding a second library.

The composability that makes it pleasant also makes it slow to refactor. Deeply nested custom children re-render on every axis change, which is where most Recharts performance complaints actually come from.

Chart.js (react-chartjs-2) – Best for canvas performance without leaving familiar ground

Chart.js (react-chartjs-2) - Best for canvas performance without leaving familiar ground

Chart.js renders to canvas, so it holds 10k to 100k points without frame drops. In React it runs through the react-chartjs-2 wrapper.

Best for dense time-series views and monitoring panels where SVG node counts become the bottleneck.

What you get:

  • Canvas rendering with 9 core chart types
  • A plugin API
  • Tree-shakeable registration
  • Animation easing controls

Pricing: Free, MIT.

Where it wins:

  • The core chart.js package pulls roughly 12M weekly npm downloads with about 67,500 GitHub stars, and the react-chartjs-2 wrapper adds several million more
  • The largest plugin ecosystem of any web charting tool
  • Core sits around 92 kB gzipped

Where it falls short:

  • Canvas output is invisible to screen readers without manual fallbacks
  • The React wrapper is community-maintained and lags major Chart.js releases

Field note: forgetting to register controllers is the number one setup failure. The error message points at the canvas, not the missing import, which sends people down the wrong path for an hour.

The plugin ecosystem covers annotations, zoom, and datalabels that other libraries charge for. Most comparison posts skip this and file Chart.js as the beginner option.

Nivo – Best for server-rendered charts with design work already done

Nivo - Best for server-rendered charts with design work already done

Nivo does real server-side rendering, which is rare among React charting packages. It also ships opinionated visual defaults, so charts look finished without a design pass.

Best for Next.js apps and content sites where charts must render on the server.

What you get:

  • SVG, canvas, and HTML renderers
  • Motion via react-spring
  • Per-package installs and a built-in theme system
  • Around 30 chart types

Pricing: Free, MIT.

Where it wins:

  • Roughly 1.5M weekly downloads on @nivo/core, the base package every chart type depends on, alongside about 14k GitHub stars. Individual chart packages like @nivo/bar and @nivo/line sit lower, since teams install only what they render
  • Sensible chart color schemes ship out of the box

Where it falls short:

  • Heavier bundle than Recharts even with modular imports
  • Config-heavy API that fights React habits

Field note: there is no nivo package to install. Searching npm for one returns a near-empty result that makes the library look abandoned, which trips people up when they’re sizing up adoption. Install @nivo/core plus only the chart packages you use, and read download stats off @nivo/core rather than the unscoped name. Pulling the whole @nivo scope is what produces those 400 kB bundle screenshots people post.

Nivo’s canvas variants (ResponsiveLineCanvas, ResponsiveHeatMapCanvas) exist under the same API. Swapping to them is a one-word change and buys a large performance jump. Almost nobody mentions it.

ApexCharts – Best for polished interactivity you would otherwise build yourself

ApexCharts

ApexCharts ships zoom, pan, brush, and annotation behavior that works without custom code. In React it runs through react-apexcharts.

Best for analytics dashboards with heavy user interaction.

What you get:

  • SVG rendering with 20+ chart types
  • Synced chart groups
  • Toolbar export to PNG, SVG, and CSV
  • Live data updates

Pricing: Dual-licensed. The Community License is free only for individuals, non-profits, educators, and organizations with under $2 million USD annual revenue. At or above that threshold you need a paid Commercial License, sold per named developer as a 12-month auto-renewing subscription across Pro, Premium, and OEM/Embedded tiers. Confirm current figures on apexcharts.com/pricing.

Where it wins:

Where it falls short:

  • No longer plain MIT
  • The React wrapper is thin, so you configure through option objects rather than components
  • The OEM tier is separately required if you embed ApexCharts into a product other people configure or interact with, though not if your app only renders static, non-interactive charts

Field note: passing a new options object on every render kills the animation and resets zoom state. Memoize it. This bites nearly every first ApexCharts integration.

The move to a dual license is the single biggest change in this category, and the terms apply to your parent company and affiliates, not just the entity that installed the package.

Your beautiful data deserves to be online

wpDataTables can make it that way. There’s a good reason why it’s the #1 WordPress plugin for creating responsive tables and charts.

An actual example of wpDataTables in the wild

And it’s really easy to do something like this:

  1. You provide the table data
  2. Configure and customize it
  3. Publish it in a post or page

And it’s not just pretty, but also practical. You can make large tables with up to millions of rows, or you can use advanced filters and search, or you can go wild and make it editable.

“Yeah, but I just like Excel too much and there’s nothing like that on websites”. Yeah, there is. You can use conditional formatting like in Excel or Google Sheets.

Did I tell you you can create charts too with your data? And that’s only a small part. There are lots of other features for you.

Apache ECharts – Best for very large datasets and unusual chart types

Apache ECharts

Progressive rendering and data sampling let ECharts handle series that break lighter libraries. It comes from the Apache Software Foundation and runs in React through echarts-for-react.

Best for data teams plotting 100k+ points or geo, Sankey, and sunburst views.

What you get:

  • Canvas or SVG renderer
  • Dataset transforms and geo maps
  • Gauge visualizations and calendar heatmaps
  • Tree-shakeable imports

Pricing: Free, Apache 2.0.

Where it wins:

  • Around 66k GitHub stars, the highest of any charting project here, and roughly 3.4M weekly downloads on the echarts package
  • Trims to roughly 100 kB gzipped when you import only what you render

Where it falls short:

  • Imperative option API sits awkwardly inside React
  • Documentation translation quality varies between sections

Field note: set notMerge deliberately. Leaving it at the default silently keeps stale series when your data shape changes, and the chart looks fine while showing yesterday’s numbers.

ECharts is the only free option here built for large-scale data rendering at the six-figure row mark. Teams usually discover this after paying for a commercial library first.

visx – Best for custom visualizations you cannot buy off the shelf

visx isn’t a chart library. It’s the toolkit you use to build one. Airbnb’s collection of low-level React and D3 primitives, aimed at teams with a design system and the engineering time to honor it.

Best for design-system teams building branded, one-off visualizations.

What you get:

  • Modular @visx/* packages
  • Scales, axes, shapes, and gradients
  • Tooltip and zoom utilities
  • D3 math without D3 DOM handling

Pricing: Free, MIT.

Where it wins:

  • ~15 kB with modular imports, the smallest footprint here
  • Around 20.8k stars on airbnb/visx

Where it falls short:

  • No prebuilt charts, so a simple bar chart is a day’s work
  • Steep curve for anyone unfamiliar with D3 scales

Field note: like Nivo, visx splits across scoped @visx/* packages, so no single download number represents it either. Budget two sprints before a visx chart matches what Recharts gives you in an afternoon. Teams that skip that estimate end up shipping a half-finished tooltip.

visx is the correct answer far less often than blog posts suggest. It pays off when you’re building three or more custom chart types that share primitives. For one chart, it’s a net loss.

Victory – Best for shared code across React web and React Native

Victory runs a near-identical component API across web and native. Originally from Formidable, now maintained under Nearform.

Best for cross-platform teams shipping web and mobile from one codebase.

What you get:

  • SVG rendering with theme objects
  • Voronoi containers for hit detection
  • Brush and zoom containers
  • Chart animation with enter and exit states

Pricing: Free, MIT.

Where it wins:

  • Around 11.1k stars and 272K weekly downloads on the victory package
  • The theming system covers style and behavior, not just colors

Where it falls short:

  • Slower release pace than Recharts
  • The native path now runs through Victory Native XL, a separate package with a different API

Field note: that “same API on both platforms” promise weakened after Victory Native XL. Verify which native package your version targets before you promise a shared codebase to stakeholders.

Victory’s Voronoi tooltip container solves the “my line chart tooltip only fires on exact hover” problem that teams usually hand-roll. It’s the reason to pick it even on web-only projects.

MUI X Charts – Best for products already standardized on Material UI

Charts inherit your palette, spacing, and typography automatically. MUI X Charts is the charting layer of the MUI X suite, released under an open-core model.

Best for internal tools and admin panels already built on Material UI.

What you get:

  • SVG single and batch renderers
  • Keyboard-first interaction
  • Sankey and heatmap in Pro, WebGL heatmap in Premium
  • Export in Pro

Pricing: Community free (MIT). Pro $15/developer/month billed annually ($180/year), Premium $49/developer/month ($588/year). Licensing is per developer seat.

Where it wins:

  • Charts match the rest of your UI with zero styling effort
  • The svg-batch renderer cuts DOM nodes on scatter plots dramatically

Where it falls short:

  • Requires @mui/material as a peer dependency, which is dead weight if you’re not already on MUI
  • The useful chart types sit behind Pro

Field note: major version upgrades ship codemods for the migration. Run them. The composition API has changed enough between versions that hand-editing a dozen chart files is a wasted afternoon.

MUI X is the only option here that made keyboard navigation the default rather than an opt-in. If accessibility sign-off is a real gate for you, that shortens the audit considerably.

Highcharts React – Best for financial and enterprise reporting with support attached

Highcharts

Highcharts is the one entry where you get a vendor to call. Commercial charting with an official React wrapper, built for regulated and enterprise environments.

Best for financial services and enterprise BI teams. Highcharts Stock carries the deepest candlestick and OHLC tooling available in JavaScript.

What you get:

  • SVG rendering with 40+ chart types
  • A server-side export server
  • An accessibility module and annotations
  • Technical indicators in Stock

Pricing: Free for non-commercial and non-profit use. Commercial licenses from around $416.50 per developer at reseller listings, with contract data putting most companies between $1,000 and $5,000/year (Vendr, ComponentSource).

Where it wins:

  • The accessibility module is the most complete in the category
  • Paid support with response commitments

Where it falls short:

  • Per-developer licensing gets expensive fast
  • SaaS and OEM deployments need a separate, pricier license class

Field note: the license audit question is “who sees the chart,” not “who wrote it.” Internal dashboards, SaaS products, and embedded OEM each fall under different terms, and teams get this wrong at procurement.

Highcharts is the only entry where the accessibility module alone can justify the cost. For public-sector and finance work with formal financial chart requirements, that line item passes review where free libraries don’t.

Tremor – Best for shipping a full analytics UI in a weekend

Tremor

Tremor speaks dashboard vocabulary rather than generic widgets. KPI cards, spark lines, bar lists, trackers. It’s a copy-paste React component library built on Tailwind CSS, Radix UI, and Recharts.

Best for early-stage SaaS teams building an analytics view fast.

What you get:

  • 35+ components and 300+ blocks
  • Copy-paste ownership model
  • Light and dark themes
  • Funnel visualizations and keyboard navigation

Pricing: Free and open source, including Blocks and every official template.

Where it wins:

  • Vercel acquired Tremor in January 2025 and released previously paid products for free
  • 16k+ stars

Where it falls short:

  • Tailwind is mandatory, not optional
  • You inherit Recharts’ SVG ceiling underneath, so it isn’t a large-dataset answer

Field note: the copy-paste model means no upgrade path. Components live in your repo, so a Tremor fix upstream doesn’t reach you unless you re-copy the file. It also means npm download counts tell you nothing about its adoption.

Tremor gets filed as a chart library. It isn’t one. It’s a dashboard component set that happens to include Recharts, and treating it as a Recharts competitor leads teams to compare the wrong things.

Cost and licensing at a glance

Four of the ten carry commercial terms, and the ApexCharts change is recent enough that plenty of teams haven’t caught up to it.

Library License Entry Cost
Recharts, Chart.js, Nivo, visx, Victory, Tremor MIT Free
Apache ECharts Apache 2.0 Free
ApexCharts Dual (Community / Commercial) Free under $2M revenue
MUI X Charts Open core Free community, Pro $180/dev/year
Highcharts Commercial From ~$416.50/dev

Check licensing before benchmarks. Performance problems have workarounds. A license breach found at audit does not.

What is a React chart library

Strip it back and it’s a package of reusable components that turn data props into rendered charts. It handles scales, axes, series drawing, tooltips, legends, and animation so you never touch raw SVG paths or canvas contexts.

React sits at 44.7% usage among developers in the 2025 Stack Overflow survey. That volume is why a dedicated charting layer exists at all.

Two architectures share the category:

  • React-native libraries: Recharts, Nivo, visx, Victory, Tremor. Components all the way down
  • Agnostic core plus wrapper: Chart.js, ApexCharts, Apache ECharts, Highcharts. A framework-neutral engine with a thin React binding

The second group survives a framework migration. The first doesn’t, which matters more now that teams routinely run React and something else side by side.

Airbnb open-sourced visx out of its own design system work. Vercel acquired Tremor in January 2025 and released previously paid products for free.

A chart library is not a BI tool, not a dashboard template, and not a data layer. It draws what you hand it. Picking between different chart types is still your job.

How to choose a React chart library

Constraints eliminate options faster than features select them. Work down this order and most of the field disqualifies itself before you read a single API doc.

Constraint What It Rules Out
Dataset over 50k points Every SVG-only library
Company revenue over $2M ApexCharts Community tier
Strict accessibility audit Canvas libraries without a text fallback
Sub-100 kB budget Full Nivo and full ECharts imports

How much data are you rendering

Count your points before you compare libraries.

Under 10,000, anything works and developer experience decides. Between 10,000 and 100,000, canvas becomes mandatory. Past that, you want progressive rendering or GPU acceleration.

The common mistake is benchmarking with 200 rows of seed data, then shipping to a customer with three years of history.

How much customization does the design actually require

  • Theme-level changes (colors, fonts, spacing) are free in every library listed above
  • Layout-level changes (custom axis ticks, annotated regions, non-standard legends) cost days in Recharts and hours in visx
  • New chart types that no library ships are the only case where low-level primitives beat a full library on total cost

Read the customization docs before you commit, not after. Deciding which chart type fits the data comes first anyway.

Which library does your existing stack already pull in

Black Duck’s OSSRA research has found commercial codebases now average many hundreds of open source components, with a large share containing packages that saw no development activity in the previous two years.

Adding a second chart library to a project that already ships one doubles your surface area for nothing.

  • shadcn/ui charts wrap Recharts
  • Tremor also builds on Recharts
  • MUI X Charts requires the full Material UI runtime

Run npm ls before you install. The answer is often already in the tree, and for scoped libraries like Nivo and visx it’s the only reliable way to see what you’re carrying.

SVG, canvas, and WebGL rendering in React charts

Rendering model decides your ceiling. Everything else is preference.

SVG creates one DOM node per data point. Average home pages now carry well over a thousand elements, so a 5,000-point scatter plot can multiply a typical page’s node count several times over on its own.

Model DOM Cost Screen Reader Access
SVG One node per point Native, with ARIA
Canvas One node total None without fallback
WebGL One node, GPU-backed None without fallback

Here’s the React angle nobody mentions. SVG charts re-render through React reconciliation, so every state change walks the tree. Canvas charts draw imperatively and sit outside that loop entirely.

Escape hatches exist. Nivo ships Canvas variants of its heaviest components under the same props, and MUI X offers an svg-batch renderer that collapses scatter series into a single path.

For anything approaching large-scale data rendering, Apache ECharts and its progressive rendering mode is the only free option that holds up.

React chart libraries in Next.js, Server Components, and SSR

Next.js reached 20.8% developer usage in the 2025 Stack Overflow survey, which makes the server boundary the most common integration failure in this category.

Median JavaScript weight on a home page now runs to several hundred kilobytes per the Web Almanac, and a chart library is often the single largest thing a team adds after the framework itself.

Charts inside React Server Components

Nearly every chart library needs the browser, so it needs 'use client'.

Nivo is the exception worth knowing. It supports real server-side rendering, which matters when the chart is part of the content rather than part of the app.

The standard workaround everywhere else is a dynamic import with ssr: false, paired with a skeleton of matching height so the page doesn’t jump.

Fixing hydration mismatch on responsive containers

Responsive containers measure their parent. On the server there’s no parent to measure, so width comes back as zero and React screams about a mismatch.

Three fixes, cheapest first:

  1. Give the wrapper an explicit height in CSS, not a percentage
  2. Render the chart only after mount with a mounted flag
  3. Dynamic import with SSR disabled

The second option costs one render cycle and solves it permanently.

Accessible charts in React

WebAIM’s annual Million report consistently finds low contrast text on around four in five home pages, making it the single most common detected accessibility failure.

Charts are where teams reproduce that failure at scale. Pale gridlines, light gray axis labels, and a six-color series palette nobody contrast-checked.

Color alone should never encode a series. Roughly 1 in 12 men and 1 in 200 women have color vision deficiency, around 300 million people worldwide, according to Colour Blind Awareness.

Pair every color distinction with a second channel: line style, marker shape, direct labels, or ordering.

Canvas output is a single element with no internal structure. Screen readers get nothing unless you supply a text summary or an accessible data table underneath.

WebAIM’s data has also found that the overwhelming majority of top home pages carry detectable WCAG 2 A/AA failures, and that pages using ARIA average more detected errors than pages without it. More ARIA is not automatically more accessible.

Following established visualization best practices handles most of this before an auditor ever opens the page.

When a chart library is the wrong tool

Sometimes the correct move is not installing anything.

Scenario Better Fit
Marketing or content page Static image or CMS charting plugin
Non-developer owns the data Config UI, not a component API
Three or more chart libraries in one app Embedded analytics platform
Static reporting, no interaction A plain data table

WordPress runs roughly 41.9% of all websites and about 59.5% of sites with a detectable CMS (W3Techs, 2026). On those sites, a WordPress charting plugin produces the same visualization with no build step and no dependency to maintain.

Recent OSSRA reporting has recorded sharp year-on-year rises in both the average number of open source components per codebase and the vulnerabilities found in them. Every dependency you add is a maintenance commitment measured in years.

The chart versus table decision also gets skipped too often. Precise values, many dimensions, and small row counts read better as a table.

Nothing on the ranked list above is wrong. Reaching for one of them when a chart generator or a table would have done is what costs teams a year of upkeep for a single quarterly report.

FAQ on React Chart Libraries

What is the best React chart library?

No single winner exists. Recharts is the practical default for standard dashboards, Apache ECharts wins on large datasets, and visx wins on custom work.

Match the tradeoff to your product, not the star count.

Is Recharts better than Chart.js?

For React ergonomics, yes. Recharts composes through JSX children and ships its own types.

Chart.js renders to canvas and handles far more data points, so it wins whenever your series pass roughly 10,000 values.

Which React chart library handles large datasets best?

Apache ECharts, through echarts-for-react. Progressive rendering and data sampling keep six-figure row counts usable.

Chart.js is the lighter canvas alternative for 10k to 100k points without exotic chart types.

Are React chart libraries free for commercial use?

Most are. Recharts, Chart.js, Nivo, visx, Victory, and Tremor ship under MIT, and ECharts under Apache 2.0.

ApexCharts, MUI X, and Highcharts all carry paid tiers. ApexCharts in particular is free only under $2M annual revenue, so check before you install.

How do I check how popular a React chart library really is?

Read download stats off the package you’d actually install. Nivo has no unscoped nivo package, so check @nivo/core (roughly 1.5M weekly) rather than the bare name. visx splits the same way across @visx/*. And discount Recharts’ figure, since UI kits pull it in as a transitive dependency, and Tremor’s copy-paste model means npm counts miss it entirely.

Which React chart library has the smallest bundle size?

visx, at roughly 15 kB with modular imports, though you write the chart yourself.

Among ready-made libraries, a tree-shaken ECharts build or a selectively registered Chart.js setup lands lowest.

Do React chart libraries work with Next.js and Server Components?

They work, but nearly all require the 'use client' directive because they need browser APIs.

Nivo is the exception with real server-side rendering. Everything else typically needs a dynamic import.

Should I use D3 directly instead of a chart library?

Only if you are building visualizations no library ships. D3 fights React over DOM ownership.

Use visx instead: D3 math for scales and shapes, React handling the rendering.

Which React chart library supports React Native?

Victory is the long-standing answer, now split between Victory for web and Victory Native XL for mobile.

The two packages no longer share an identical API, so verify before promising code reuse.

How do I make React charts accessible?

Never encode meaning in color alone, keep contrast above WCAG AA, and pair every chart with a data table fallback.

Canvas output gives screen readers nothing without that fallback.

Can React chart libraries handle real-time data?

Yes. ApexCharts, ECharts, and Chart.js all update series without full remounts.

The usual failure is passing fresh option objects on every render, which resets animation and zoom state.

Conclusion

The React chart libraries above solve different problems, and the gap between them only shows under load.

Start with data volume. SVG holds to roughly ten thousand points, canvas carries you to a hundred thousand, WebGL goes past that.

Then check the boring things: TypeScript definitions, tree shaking, keyboard navigation, and whether weekly npm downloads reflect an active maintainer or old momentum.

Most of this field is open source visualization tooling, so trying two candidates costs an afternoon, not a sprint.

Build one real chart with your own data before you commit. Custom tooltips, a responsive container, and a live series update will teach you more in an hour than any comparison table.


Milan Jovanovic
Milan Jovanovic

Product Lead

Articles: 281