Vitral 0.2
Charts

29 charts, drawn without a dependency

One SVG engine, no plotting library underneath, driven by the options object ApexCharts made familiar. Everything visual is plain data, so it survives JSON and a settings screen can write it. Each chart is named by a summary generated from its own data, and its plot takes focus: the arrow keys read it point by point.

Over time

Line

type="line"
Line chart, 1 series: Visitors. Visitors, 12 points from 310 to 980. from Jan to Dec

One value as it moves. The chart to reach for first, and the one a reader never has to be taught.

Line, several series

type="line"
Line chart, 3 series: API, Web, Jobs. API, 12 points from 120 to 330. Web, 12 points from 80 to 220. Jobs, 12 points from 28 to 60. from Jan to Dec

Two or three lines compare shapes. Past four, the plot becomes a knot and a small multiple reads better.

Area, stacked

type="area"
Area chart, 3 series: API, Web, Jobs. API, 12 points from 120 to 330. Web, 12 points from 80 to 220. Jobs, 12 points from 28 to 60. from Jan to Dec

A total over time, and what it is made of. Stacked, the top edge is the total; unstacked, the fills overlap and mislead.

Range area

type="rangeArea"
Range area chart, 1 series: Forecast. Forecast, 12 points from 70 to 136. from Jan to Dec

The band between a low and a high, month by month: a forecast’s spread, or the day’s range. One fill, two edges.

Stream

type="stream"
Stream chart, 5 series: Search, Direct, Social, Mail, Referral. Search, 12 points from 30 to 66. Direct, 12 points from 27 to 70. Social, 12 points from 36 to 89. Mail, 12 points from 33 to 77. Referral, 12 points from 36 to 89. from Jan to Dec

A stacked area floating on a baseline of its own. The bands share the movement instead of the bottom one carrying it, which is what makes the shape readable.

Bars and a line

type="bar"
Bar chart, 2 series: Revenue, Margin. Revenue, 12 points from 22 to 81. Margin, 12 points from 9 to 22. from Jan to Dec

Two marks on one plot: the amount as bars, the rate as a line, each on its own axis. Every series names the mark it wants.

Candlestick

type="candlestick"
Candlestick chart, 1 series: ACME. ACME, 7 points from 52 to 65. from Mon to Sun

Four numbers a period: open, high, low and close. Each point is a tuple, in that order.

Calendar

type="calendar"
Calendar chart, 1 series: Commits. Commits, 277 points from 1 to 14. from Jan 1, 2026 to Dec 31, 2026

A year of days as a grid of weeks. A line of 365 points shows the trend; this shows the day, which is what a record of daily activity is read for.

Compared

Bar, grouped

type="bar"
Bar chart, 3 series: North, South, East. North, 4 points from 41 to 67. South, 4 points from 8 to 23. East, 4 points from 11 to 17. from Q1 to Q4

Amounts side by side. The baseline has to be zero: a bar says how big, and a cut axis lies about it.

Bar, stacked

type="bar"
Bar chart, 3 series: North, South, East. North, 4 points from 41 to 67. South, 4 points from 8 to 23. East, 4 points from 11 to 17. from Q1 to Q4

The total per category, split. Only the bottom band is easy to compare across categories — put the series that matters there.

Bar, to 100%

type="bar"
Bar chart, 3 series: North, South, East. North, 4 points from 41 to 67. South, 4 points from 8 to 23. East, 4 points from 11 to 17. from Q1 to Q4

Shares rather than amounts: every bar is full, so the mix is comparable and the size is gone.

Bar, horizontal

type="bar"
Bar chart, 1 series: Requests. Requests, 6 points from 22 to 67. from Authentication to Exports

Long category names, or many of them: the labels get the room they need and stay level.

Lollipop

type="lollipop"
Lollipop chart, 1 series: Requests. Requests, 6 points from 22 to 67. from Authentication to Exports

A bar with the ink taken out. The same comparison at a fraction of the weight, for a page with many of them.

Waterfall

type="waterfall"
Waterfall chart, 1 series: Cash. Cash, 6 points from -260 to 1,490. from Opening to Closing

How a number got from one total to another. Each bar starts where the last one stopped; a total bar returns to zero.

Range bar

type="rangeBar"
Range bar chart, 1 series: Temperature. Temperature, 4 points from 17 to 29. from Q1 to Q4

A bar between two numbers instead of up from zero. Each point is `[low, high]`, so it reads as a span rather than an amount.

Bullet

type="bullet"
Bullet chart, 1 series: Against target. Against target, 4 points from 41 to 112. from Revenue to Margin

One measure, its target and the bands it falls in: a gauge’s job in a strip a table row can hold. The tick is the target, the bands are poor, fair and good.

Spread

Scatter

type="scatter"
Scatter chart, 2 series: Trial, Paid. Trial, 8 points from 40 to 83. Paid, 8 points from 22 to 62

Two measures against each other, one point a thing. What it is for is the shape of the cloud, not any one dot.

Bubble

type="bubble"
Bubble chart, 2 series: Europe, Americas. Europe, 4 points from 40 to 83. Americas, 4 points from 22 to 48

A scatter with a third number as the area. Area, not radius: doubling the radius would draw four times the quantity.

Heat map

type="heatmap"
Heat map chart, 5 series: Mon, Tue, Wed, Thu, Fri. Mon, 6 points from 8 to 85. Tue, 6 points from 8 to 96. Wed, 6 points from 19 to 85. Thu, 6 points from 8 to 96. Fri, 6 points from 19 to 96. from 09 to 19

A grid where colour is the value: two categories in, one measure out. Good for a week by an hour.

Histogram

type="histogram"
Histogram chart, 1 series: Response time. Response time, 11 points from 0 to 12. from 30–40 to 130–140

Raw readings in, counts out: the chart works out the bins itself. Pass a plain list of numbers, not categories.

Box plot

type="boxPlot"
Box plot chart, 1 series: Response time. Response time, 3 points from 22 to 68. from API to Jobs

Five numbers a category — minimum, quartiles, median, maximum — so two distributions compare without either being averaged away.

Parts of a whole

Treemap

type="treemap"
Treemap chart, 3 series: Europe, Americas, Asia. Europe, 4 points from 10 to 84. Americas, 4 points from 12 to 132. Asia, 3 points from 14 to 61. from United States to Portugal

Shares of a total as areas rather than as angles. It holds many more parts than a pie, and the boxes are laid squarely so none of them is a sliver.

Radial bar

type="radialBar"
Radial bar chart, 3 series: Storage, Memory, CPU. Storage, 1 points from 72 to 72. Memory, 1 points from 48 to 48. CPU, 1 points from 35 to 35. from Storage to CPU

A ring a measure, as far round as its share of the maximum. Three or four at a time: they are read against their own tracks, not against each other.

Gauge

type="gauge"
Gauge chart, 1 series: Uptime. Uptime, 1 points from 96 to 96

One number against its maximum, with the reading in the middle. The arc leaves the bottom open, which is what tells it apart from a ring at a glance.

Sunburst

type="sunburst"
Sunburst chart, 3 series: Europe, Americas, Asia. Europe, 4 points from 47 to 199. Americas, 4 points from 39 to 243. Asia, 3 points from 55 to 116. from Europe to India

A pie of several rings, one a level of a tree. It answers what a pie cannot — what a slice is made of — without leaving the circle.

Pie

type="pie"
Pie chart, 1 series: Direct, Search, Social, Mail. Direct: 44%, Search: 30%, Social: 18%, Mail: 8%

Shares of one total, at a glance. Three or four slices; past that the angles stop being readable and a bar is kinder.

Donut

type="donut"
Donut chart, 1 series: Direct, Search, Social, Mail. Direct: 44%, Search: 30%, Social: 18%, Mail: 8%

A pie with the middle free, which is where the total goes. The hole is what makes it worth using.

Radar

type="radar"
Radar chart, 2 series: This release, Last release. This release, 6 points from 60 to 90. Last release, 6 points from 55 to 75. from Speed to Tests

A profile across the same few measures, for comparing two or three subjects on shape rather than on level.

Funnel

type="funnel"
Funnel chart, 1 series: Signups. Signups, 5 points from 610 · 13% to 4.8K · 100%. from Visited to Renewed

Stages of a process, each as wide as its share of the first. What it is read for is where the drop is, so the labels carry the percentages.

Beyond the shapes

  • Zoom and brush. Drag on the plot to zoom, or pair a chart with a brush chart that selects the window.
  • Synced groups. Charts sharing a group move their tooltip and their window together.
  • Themed by tokens. Colours, grid and type come from the same tokens as the components, light and dark.
  • Without Vue. @vitral/chart mounts into any element; the Vue component is a wrapper over it.

All of it is on the Chart page