Report Chart Reference

Last update: September 14, 2026
•
1 min to read

🧪 Experimental feature (preview). This feature is under active development and released early so you can try it and give feedback. Behaviour, options, and results can change without notice, and it isn’t covered by the usual support and stability guarantees. Avoid relying on it for production work.

Overview

A Report chart tile names a chartType and a handful of columns. Between your JSON and the chart primitive that draws it sits an adapter: a small piece of data shaping that groups, rolls up, buckets or pivots the page’s records into the shape that primitive wants. Which adapter runs — and therefore which fields the tile reads — is decided by the chart’s family.

This page is the reference for that layer. For the envelope around a tile (size, palette, theme, filter, the list and hosted tiles), see Writing Report Definitions. For which chart to choose given a set of columns, see Designing a Report from Data.

Two facts shape everything below:

  • Every tile is 300 px tall. A chart has to read at that size. Fewer categories and shorter labels always win.
  • Aggregation happens at render time from the records on the page. You choose columns and a method; you never write values. Text that looks like a number is treated as a number; a cell that’s empty groups under (none).

How a chart gets its data

Ten adapters feed the 36 chart types. Knowing what they do explains most surprises.

Categorical roll-up

Feeds: bar, horizontalBar, lollipop, pareto, pie, donut, treemap, funnel, waterfall, line, area, sparkline, figure, gauge, bullet.

Groups the records by dimension and rolls up measure with aggregation:

  • count — rows per group. measure is ignored (write "").
  • sum — the total of measure per group. Non-numeric cells count as 0.
  • avg — the mean of measure per group.

Values are rounded to two decimals. Groups are sorted largest first and capped at 8: the top 7 keep their names and everything else is lumped into one Other bucket (for avg, Other is the mean of the lumped means). Empty cells group as (none).

Two consequences matter. A dimension with dozens of values still renders — as seven bars and a big Other — so pick dimensions with 2–12 distinct values. And the order is by value, never by your data’s order, which is why the line, area and funnel charts in this family don’t preserve a sequence (see each chart below).

Pivot

Feeds: groupedBar, stackedBar, radar, heatmap, sunburst.

A two-way table: dimension values become the categories (most frequent first, capped at 12), seriesField values become the series (most frequent first, capped at 8), and each cell is the roll-up of measure by aggregation for that pair. Both columns should be categoricals with a handful of values each; a 12 × 8 heatmap is the most a 300 px tile will show legibly.

Time buckets

Feeds: timeSeries, timeBar, cumulative, burndown, calendar.

Parses dimension as a date, buckets every row into the calendar period named by granularity (day, week, month, quarter, year), rolls up measure by aggregation per period, and returns the periods in chronological order. Rows whose date won’t parse are skipped.

  • Empty periods between the first and last are filled with zero so gaps read as gaps (not for avg, where a zero mean would be a lie). At most 400 periods are shown; a day-grained span of many years keeps only the latest 400.
  • Date parsing handles ISO (2026-03-01), slash and dash dates, epoch numbers, and anything the browser parses. Day-first versus month-first is detected from the whole column (a component over 12 settles it), so 1/6/2026 is read consistently for the data rather than always as January 6th.
  • Labels follow the grain: Aug 5, Aug 2026, 2026-Q3, 2026.

Weeks start on Monday. cumulative replaces each period’s value with the running total to that point.

Flow stages

Feeds: sankey, network, flow.

Reads stageFields, an ordered list of at least two columns. Each record threads through every stage in order, and links are aggregated between every consecutive pair (stage 0 → 1, 1 → 2, …), weighted by measure/aggregation. Nodes are scoped to their stage, so the value "Open" in stage 1 and "Open" in stage 3 are two different nodes and the graph stays a clean left-to-right flow. Zero-weight links are dropped; at most 120 links are kept. With stageFields absent, the adapter uses [dimension, seriesField] as a two-stage flow.

XY points

Feeds: scatter, bubble.

One point per record: xMeasure and yMeasure (and sizeMeasure for bubbles) read as numbers; rows where either won’t parse are skipped. No aggregation. An optional seriesField colours the points by group, up to 8 groups.

Box statistics

Feeds: boxplot.

Groups measure values by dimension and computes min, lower quartile, median, upper quartile and max per group, for up to 12 groups. No aggregation; needs several rows per group to mean anything.

Histogram values

Feeds: histogram.

Collects every numeric value of measure across all rows — no dimension, no aggregation — and the primitive bins them into equal-width bins spanning the observed range.

Daily OHLC

Feeds: candlestick.

Groups rows by the calendar day of dimension, and for each day takes measure’s first value as open, last as close (in the order the records arrive), and the day’s extremes as high and low. No aggregation. Days are ordered chronologically.

Spans

Feeds: gantt.

One bar per record from startField to endField (both parsed as days; rows missing either are skipped; an end before its start is swapped). labelField names the row, falling back to #1, #2, …; seriesField colours bars by group. At most 60 spans, sorted by start.

Families at a glance

FamilyChart typesFields readAdapter
categoricalbar, horizontalBar, lollipop, pareto, pie, donut, treemap, funnel, waterfall, line, area, sparkline, figure, gauge, bulletdimension, measure, aggregationCategorical roll-up
seriesgroupedBar, stackedBar, radar, sunburstdimension, seriesField, measure, aggregationPivot
matrixheatmapdimension (X), seriesField (Y), measure, aggregationPivot
flowsankey, network, flowstageFields, measure, aggregationFlow stages
xyscatter, bubblexMeasure, yMeasure, sizeMeasure (bubble), seriesFieldXY points
distributionboxplotdimension, measureBox statistics
histogramhistogrammeasureHistogram values
ohlccandlestickdimension (date), measureDaily OHLC
timetimeSeries, timeBar, cumulative, burndowndimension (date), granularity, measure, aggregationTime buckets
calendarcalendardimension (date), measure, aggregationTime buckets (always daily)
ganttganttstartField, endField, labelField, seriesFieldSpans

Fields a family doesn’t read are ignored, not rejected. Setting only what’s needed keeps a definition honest about what drives each chart.

Chart by chart

Grouped the way the picker groups them. “Best with” describes the data shape that makes the chart worth looking at. Palette group: categorical means distinct hues for unordered categories (ember, tableau, slate, earthen); sequential means a continuous ramp for magnitude or order (viridis, inferno, magma, plasma, cividis, turbo, warm, cool, spectral). See Palettes.

Compare

chartTypeDrawsBest withNotes
barVertical bars, one per categorytext/boolean dimension with 2–12 valuesThe safe default. Legend on either side, or off (labels move to the axis). Categorical palette.
horizontalBarBars running left to right6–12 categories or long labelsLabels read sideways without truncation. No legend control. Categorical.
lollipopA dot on a stem per categorySparse comparisons where bars feel heavySame data as a bar with less ink. No legend control. Categorical.
paretoBars largest-first plus a cumulative-percent line“Which few categories make up most of the total?”The roll-up is already largest-first, so the pareto line is meaningful. No legend control. Categorical.
groupedBarClustered bars: a bar per series within each categoryTwo categoricals, ≤ 8 × 8dimension = clusters, seriesField = bars within a cluster. Legend side/off. Categorical.
stackedBarOne bar per category, split by seriesSame shape, when the per-category total mattersLegend side/off. Categorical.
radarA polygon per series over shared axes3–8 categories, 2–4 seriesdimension = axes, seriesField = polygons. Gets noisy fast. Legend side/off. Categorical.

Composition

chartTypeDrawsBest withNotes
pieSlices with a side legend2–6 categoriesPast six slices the small ones vanish. Legend on/off. Categorical.
donutPie with an open centre2–6 categoriesLegend on/off. Categorical.
sunburstTwo concentric ringsdimension (inner ring) × seriesField (outer ring)Without seriesField it degrades to a single-ring donut of the roll-up. No legend control. Categorical.
treemapNested rectangles sized by valueUp to ~12 categories with one measureIn-cell labels appear only on big cells; the side legend carries the rest. Legend on/off. Categorical by count; sequential when sized by a measure.
funnelNarrowing stagesReal stage-like drop-offStages are ordered by value, largest first, not by any order in your data — so the funnel shows relative size of stages, and only reads as a true funnel when the stages really do shrink in sequence. Legend on/off. Categorical.
waterfallRunning total across stepsContributions that add up to a totalEvery category is a positive step in largest-first order, so it reads as “how the total accumulates”. Legend side/off. Sequential.

Trend

chartTypeDrawsBest withNotes
timeSeriesA line over calendar periodsAny date columnUse this for dates. Chronological, gap-filled, bucketed by granularity. No legend control. Sequential.
timeBarColumns over calendar periodsDated counts where volume per period mattersSame buckets as timeSeries. Legend side/off (axis labels when off). Sequential.
cumulativeFilled running total over periodsGrowth-to-date, backlog accumulatedSame buckets, running sum. No legend control. Sequential.
burndownRemaining work over periodsGenuine remaining-work data onlyPlots each period’s value as “remaining”, with the largest bucket as the total and first/last periods as start and deadline. Meaningless on ordinary event counts. No legend control. Sequential.
lineA line over the categorical roll-upRarely the right choice in a reportPoints are sorted by value, not by order — a line over a date column will not be chronological. Reach for timeSeries instead. No legend control.
areaFilled version of lineRarelySame caveat. Prefer cumulative. No legend control.
sparklineA tiny trend line with the latest value and its deltaRarely, as wired todayFed the value-sorted roll-up, so the line always slopes down and the delta is the gap between the two smallest groups. For a compact trend, use a timeSeries at size S. Legend side.

Time

chartTypeDrawsBest withNotes
calendarA weekday × week grid, one cell per day, coloured by valueA date column spanning weeks to months, many rowsAlways daily; granularity is ignored. Pointless for a handful of rows. Sequential palette, always.
ganttOne bar per record on a shared date axisTwo date columns (start and end) plus a naming columnstartField, endField, labelField; seriesField colours by group. Up to 60 bars sorted by start. Categorical when grouped.
candlestickOpen/high/low/close per dayA dated numeric that changes within a daydimension = date column, measure = the value. Needs several rows per day; one row per day gives a flat candle. No legend control.

Distribution

chartTypeDrawsBest withNotes
histogramEqual-width bins of one numeric columnA genuine measure with spread (amounts, durations, ages)measure only — no dimension, no aggregation. Never bin an id. No legend control.
boxplotMin/quartiles/median/max per groupA measure with several rows per categorydimension + measure; up to 12 groups. Legend side/off. Categorical.
heatmapA colour matrixTwo categoricals and a measure (or counts)dimension = columns (X, ≤ 12), seriesField = rows (Y, ≤ 8). orientation moves the colour scale. Sequential palette, always.

Relationship

chartTypeDrawsBest withNotes
scatterOne dot per recordTwo numeric columns that both varyxMeasure, yMeasure; optional seriesField for colour (≤ 8 groups). Ids are never valid axes. Legend side/off. Categorical.
bubbleScatter with dot area from a third numericThree varying numericsAdds sizeMeasure. Legend side/off. Categorical.
sankeyWeighted ribbons between ordered stages2–4 categorical columns that form a real progressionstageFields in order; measure/aggregation sets ribbon weight. Legend side/off. Categorical.
networkA force-laid node-link graphThe same staged columns, when the connections matter more than the weightsNodes are coloured by stage; links are unweighted. Legend side/off. Categorical.
flowBoxes and arrows in left-to-right columnsThe same staged columns, when it should read like a flowchartLegend side/off. Categorical.

Single value

chartTypeDrawsBest withNotes
figureKPI cards: the largest group as a hero number, the rest listed beside itA low-cardinality dimension where the top value is the headlineIt is one number per category, not one total. For a single headline figure use the hosted numberLabel tile, or a figure whose dimension has one value. orientation picks the list’s side. Sequential.
gaugeA 270° dialA total that should read against a round ceilingValue = the sum across all groups (total records, or total of measure); the maximum is the next “nice” number (1, 2, 5 × 10ⁿ) above it. There is no real target — it’s a total with a ceiling. Legend side/off. Sequential.
bulletA bar per category against a target tickCategories to compare against their own averageThe target is the mean across categories; the range is a nice ceiling. Skip unless “above or below average” is the point. Legend side/off. Categorical.

Legends and orientation

orientation (left / right) and showLegend: false don’t apply to every chart. What they do depends on the primitive:

ChartsorientationshowLegend: false
bar, timeBar, groupedBar, stackedBar, boxplot, waterfallMoves the legend to that sideHides the legend and labels the axis instead
figure, gauge, bullet, sparkline, radar, heatmap, sankey, network, flow, scatter, bubbleMoves the legend or list to that sideHides the legend (radar, gauge, sankey, network, flow, scatter, bubble); no effect on figure, bullet, sparkline, heatmap
pie, donut, treemap, funnelNo effectHides the side legend
calendar, ganttMoves the legend / colour scale to that sideNo effect
horizontalBar, lollipop, pareto, sunburst, line, area, timeSeries, cumulative, burndown, histogram, candlestickNo effectNo effect

Omit showLegend for the default (shown). A legend hidden on a bar chart is often the better small-tile choice: the axis labels are right under the bars.

Palettes

Thirteen palettes in two groups. Match the group to what the colour encodes.

Categorical — distinct hues for unordered categories. Eight swatches each, cycling when a chart needs more.

paletteSwatches
ember#d6480a #e8843c #caa036 #7d8b5a #4f8a86 #9c5f74 #a23b2e #6b4f3a
tableau#4e79a7 #f28e2b #e15759 #76b7b2 #59a14f #edc948 #b07aa1 #ff9da7
slate#3d5a80 #5e81ac #6c8a9c #5b8a72 #4f7d9c #7a6fa8 #9aa5b1 #566573
earthen#a8553f #c9a05e #7f9070 #6b8a99 #9a6a7a #8c6b4f #b08968 #5c6b66

Sequential — a continuous ramp sampled evenly across however many values the chart has (a single value takes the midpoint). They encode magnitude or order.

paletteCharacter
viridispurple → teal → yellow; the all-rounder, reads on light and dark
plasmaindigo → magenta → orange → yellow; high contrast
inferno, magmablack → red/pink → pale yellow; dramatic, best on dark cards
cividisnavy → grey → yellow; colour-blind safe
turborainbow with a dark floor; very high contrast
warm, coolpurple → orange / purple → green; softer ramps
spectralred → yellow → blue; a diverging feel

Which group for which chart. Sequential for heatmap, calendar, gauge, figure, waterfall, burndown, the time family, and a treemap sized by a measure. Categorical for everything that names discrete groups: bar, horizontalBar, lollipop, pareto, pie, donut, sunburst, funnel, groupedBar, stackedBar, radar, sankey, network, flow, scatter, bubble, boxplot, bullet, gantt, and the list tile. Any palette renders on any chart — the group is about whether the colours say something true.

Keep a report to one categorical palette and one sequential palette. A different palette per tile reads as noise. On the dark canvas themes, the brighter categorical sets (tableau, ember) and the high-contrast ramps (viridis, plasma, turbo) hold up best; earthen and slate suit the light themes.

The tile’s accent bar (the coloured strip along the top of the card) is the palette’s first colour, so palette choice also colours the chrome.

Defaults and self-healing

When data arrives, each tile checks that the columns it needs exist and quietly fills any that don’t:

Chart needsIf missing, it picks
dimension (most families)the first text/boolean column with 2–20 distinct values, else the first non-empty column
dimension (time, calendar, candlestick)the first date column, else as above
xMeasure, yMeasure, sizeMeasurethe first, second and third numeric non-key columns that vary
stageFields (fewer than 2)the first two columns
startField, endField, labelField (gantt)the first two date columns (or the same one twice) and a low-cardinality text column
measure (boxplot, histogram, candlestick)the first numeric non-key column

A column whose name is id, key, guid, or ends in .id / .guid is treated as a surrogate key and never auto-picked as a measure or axis. You can still name one explicitly; you shouldn’t.

Self-healing exists so a freshly added tile shows something. It’s not a substitute for naming the columns you mean — an auto-picked dimension may be the least interesting column in the data.