Skip to content

Dumbbell chart

Two values per item, and the gap between them.

Definition · Updated Nov 2, 2026

A dumbbell chart draws two dots per item joined by a bar, so the gap between them is the shape you read. Use it for our price against a rival's, plan against actual, or before against after for many items.

Pay once. Every update included.

Live preview

Price watchOur price is lower than the rival's on 4 of 6 products; the widest gaps are −$10 (Trail runner, Fleece mid) and +$7 (Rain shell).$0$50$100$200Trail runner−$10Rain shell+$7Fleece mid−$10Daypack 20L−$5Wool beanie+$5Hiking pole−$6OUR PRICERIVAL PRICE
Price watch
ProductOur priceRival priceGap
Trail runner$129$139−$10
Rain shell$179$172+$7
Fleece mid$79$89−$10
Daypack 20L$64$69−$5
Wool beanie$29$24+$5
Hiking pole$49$55−$6

Sample data: our price against the rival's for six outdoor products, gaps from −$10 to +$7

Size
Legend
Data shape
Two values per item
Good for
Price against rival, plan against actual
Avoid when
Only one value per item
Sizes
XS, S, M and L, re-laid out from the data

Anatomy

Inspect it like the Figma file.

The same layers, names and tokens as the component. Select one to read its size, fill and style.

Layers

066 / Dumbbell

chart/066-dumbbell-prices
plot · dumbbell
Layer
gap · trail runner
Type
Rectangle
Size
31 × 2
Fill
status/success
Radius
1
Group
Marks · 18

Layers

066 / Dumbbell

chart/066-dumbbell-prices
plot · dumbbell
Layer
gap · trail runner
Type
Rectangle
Size
7 × 2
Fill
status/success
Radius
1
Group
Marks · 18

Sizes

Re-laid out, never scaled.

The same data at XS, S, M and L. Every size is redrawn from the data, so text and line weights never shrink.

M against S

Width360 px480 px

Plot328 px440 px

Labels1717

Marks1818

Height212 px246 px

Same tokens at every size: text styles, 1 px lines and mark radius stay put.

When to use

The gap is the story.

Three signs it fits, and three signs another type fits better.

Are there two values per item?

One value per item.

Yes: Keep the dumbbell

Is it two things compared, not a change?

Before and after over time.

Yes: Keep the dumbbell

Is it a list of items?

Areas with fixed and broken cases.

Yes: Keep the dumbbell

Code and Figma

One name in Figma and in code.

Every Figma property is a prop with the same name and values. One command installs it.

Figma

chart/066-dumbbell-prices

size
legend
Property = propValuesDefault
size"xs" · "s" · "m" · "l""xs"
legendtrue · falsetrue
color"cat-1" · "cat-2" · "cat-3" · "cat-4""cat-1"
npx shadcn add @chartory/dumbbell
dumbbell.tsx
import { Dumbbell } from "@/components/chartory/dumbbell"import { priceGaps } from "./price-gaps"export function PriceGaps() {  return (    <Dumbbell      data={priceGaps}      size="m"      legend={true}    />  )}

Hearth widget

Dumbbell as a widget.

The chart in a Hearth card with a hero number and two blocks. One token set, light and dark.

Code
Get the code

EmberPreset

ChartoryDefault preset

Pick the blocks, the size and the preset for your own widget.

Read the Hearth widget docs

FAQ

Dumbbell questions.

What people ask before they put a dumbbell in a dashboard.

Something else?

hello@usechartory.com
  • In a column on the right, signed (Trail runner −$10, Rain shell +$7 in the sample), so the list reads as cheaper or dearer than the rival.

Related types

The same question, a different shape of answer. Every type ships in Figma and in code.

Same family

Compare items

Rank, gap and change between products, teams or regions.