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.
Table of Contents
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 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
rechartspackage. 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 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.jspackage pulls roughly 12M weekly npm downloads with about 67,500 GitHub stars, and thereact-chartjs-2wrapper 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 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/barand@nivo/linesit 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 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:
- Best-in-class default chart interactivity
- Active release cadence
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.

And it’s really easy to do something like this:
- You provide the table data
- Configure and customize it
- 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

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
echartspackage - 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
victorypackage - 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-batchrenderer cuts DOM nodes on scatter plots dramatically
Where it falls short:
- Requires
@mui/materialas 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 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 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:
- Give the wrapper an explicit height in CSS, not a percentage
- Render the chart only after mount with a mounted flag
- 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.





