line-charts

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.

The libraries

D3

Low-level toolkit. The quality ceiling — you build every pixel.

~90 KB · ISC/BSD

Observable Plot

Concise grammar of graphics from D3's author. Great defaults.

~65 KB · ISC

Vega-Lite

Charts as declarative JSON specs you can lint and diff.

~320 KB · BSD-3

Plotly.js

Batteries-included. Zoom, pan, export, log toggle — all free.

~1.1 MB · MIT

Chart.js

The popular default. Small, friendly, canvas, big plugin scene.

~70 KB · MIT

Apache ECharts

Production-hardened. Built-in dataZoom, SSR, huge-series modes.

~330 KB · Apache-2.0

µPlot

The performance option. ~18 KB, 100k+ points in milliseconds.

~18 KB · MIT

Scorecard

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
D35252*5445
Observable Plot55334433
Vega-Lite45434234
Plotly.js34354134
Chart.js34343535
Apache ECharts43455354
µPlot33245523

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

The four test charts

Considered, not included (yet)

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.