A 2026 bake-off of leading open-source line-charting libraries. Every library draws the same four datasets with the same palette, so what you are comparing is the library — its default quality, its API, how it handles real-world messiness — and not someone's styling effort. View the source of each chart inline.
A modern rebuild of datopian/line-charts (2016). Zero build step — plain HTML + ES modules. Read ANALYSIS.md for method and EVALUATION.md for the verdict.
Low-level toolkit. The quality ceiling — you build every pixel.
Concise grammar of graphics from D3's author. Great defaults.
Charts as declarative JSON specs you can lint and diff.
Batteries-included. Zoom, pan, export, log toggle — all free.
The popular default. Small, friendly, canvas, big plugin scene.
Production-hardened. Built-in dataZoom, SSR, huge-series modes.
The performance option. ~18 KB, 100k+ points in milliseconds.
Subjective, 1–5, from building the four charts on this site. 5 = excellent, 1–2 = weak. Full reasoning in EVALUATION.md.
| Library | Default look |
API ergonomics |
Custom ceiling |
Interactivity (built-in) |
Perf (4k pts) |
Bundle | A11y / SSR |
Docs / ecosystem |
|---|---|---|---|---|---|---|---|---|
| D3 | 5 | 2 | 5 | 2* | 5 | 4 | 4 | 5 |
| Observable Plot | 5 | 5 | 3 | 3 | 4 | 4 | 3 | 3 |
| Vega-Lite | 4 | 5 | 4 | 3 | 4 | 2 | 3 | 4 |
| Plotly.js | 3 | 4 | 3 | 5 | 4 | 1 | 3 | 4 |
| Chart.js | 3 | 4 | 3 | 4 | 3 | 5 | 3 | 5 |
| Apache ECharts | 4 | 3 | 4 | 5 | 5 | 3 | 5 | 4 |
| µPlot | 3 | 3 | 2 | 4 | 5 | 5 | 2 | 3 |
* D3 interactivity is 2 out of the box because there is no box — the crosshair on the D3 page is ~25 lines of hand-written code. Its ceiling is 5.
Palette is the validated categorical reference palette (colour-blind-safe, light + dark).
Add a library: copy demos/uplot.html + demos/uplot.js, swap the CDN and the four render functions, add a card here.