dbt Charts ships a fixed set of chart types, and many more shapes compose from
them. This page lists both, then covers what to do when the shape you want is
not there.
A composed chart is a shape you ask for by name that has no type: of its own.
Each is built from the types above plus layers, overlays and styling, and each
stays a plain, typed board file. The
composed chart shapes
example in the Playground shows these side by side:
Shape
Built from
Lollipop
A thin bar with a point layered on its end
Bullet
A bar measure over banded target bars
Slope
A line with two ordered categories on the x axis
Bump
A line of ranks over time
Dot plot
A scatter with a category on one axis
Streamgraph
An area with style.stack: center, a shared centered baseline
Composed Chart Shapestype: bar thinned to a stem with a scatter layer on the same measure.Region ARegion BRegion CRegion DRegion ERegion FRegion GRegion H020406080100Lollipoptype: bar thinned to a stem with a scatter layer on the samemeasure.stacked qualitative bands, a narrow value bar layer, and a step-band goal marker. Vertical only: the canonical horizontal bullet cannot draw the goal marker, because the step band is measured along the horizontal axis.Unit AUnit BUnit CUnit DUnit E050100ActualGoalGoodSatisfactoryPoorBandBulletstacked qualitative bands, a narrow value bar layer, and astep-band goal marker. Vertical only: the canonical horizontal b…type: line with a two-category x and color: on the entity.BeforeAfter406080Slopetype: line with a two-category x and color: on theentity.Region ARegion CRegion FRegion ERegion DRegion Btype: line on a rank measure with a descending axis_y.scale.continuous.domain.20192020202120222023654321Bumptype: line on a rank measure with a descendingaxis_y.scale.continuous.domain.Region CRegion FRegion DRegion BRegion ARegion Etype: scatter over long-format rows with color: on the series, no layers, so the measure axis stays the measure axis when the chart is rotated.020406080Region ERegion BRegion HRegion ARegion FRegion DRegion CRegion G201920242029SeriesDot Plottype: scatter over long-format rows with color: on the series, nolayers, so the measure axis stays the measure axis when the ch…type: area with style.stack: center, so the bands share a centered baseline instead of the axis.Jan2024AprJulOct05001,000Streamgraphtype: area with style.stack: center, so thebands share a centered baseline instead of…Holiday RushNew ArrivalBackground NoiseSummer FlingSlow BleedWord of MouthSteady StaplesData as of 14:30 UTC on 20 Oct 2026made withdbt Charts
The building blocks are documented on their own pages:
layered charts for stacking marks on one chart,
small multiples for repeating one chart across a
dimension, and interactions for the controls around them.
Compose it. Most editorial shapes are a known type plus a layer or a
style. Start from the closest built-in type and read
layered charts before assuming you need something new.
Draw it with a template.type: custom draws a chart from a Jinja SVG
template that reads the query rows and the board's style. Sankey diagrams,
funnels, gauges, radial bars, XmR charts, pictograms, waffles, and radar
charts all have ready-made templates. See Custom charts and
Custom chart examples.
Draw it in a text block. A text: block is Markdown, so it can carry an
image, including an SVG you rendered elsewhere:
text:|
Turn on raw HTML. On boards you host yourself, html_policy: trusted-raw
at the board root lets a text: block carry raw HTML through a tag allowlist.
The allowlist covers structure, headings, inline text, lists, tables and
images. <svg>, <canvas>, <script> and <style> are dropped. dbt Charts
Cloud caps the policy below this tier, so raw HTML does not render there. See
HTML policy.
Render it somewhere else.dct render exports a board to SVG, PNG, PDF or
HTML, so a board can be one piece of a larger page. See
Output formats.
Ask for the type. If a shape keeps coming up, open an issue at
dbt-labs/dbt-charts with a
sketch of it. The list above grows from those requests.
Arbitrary Vega-Lite (spec, mark, encoding, transform, and the
composition operators) is rejected on the authored surface on purpose: every
board stays a typed, reviewable file that renders the same everywhere. A
custom chart keeps that promise: its template is a file in the project, its
channels and options are declared and validated, and its output is checked SVG.