Dumbbell Plume: 9 use cases
Step by step: plan versus actual, an animated pay gap ★, one point per year, target reached or missed, market range, logos, groups by region.
Lire en françaisThese recipes start from a Dumbbell Plume already in place. If you don't have one yet, start with the getting started guide: the examples reuse its data (store sales in 2024 and 2025). Features marked ★ are premium: they work without a license, with a watermark.
How do I compare plan and actual in a budget?
The controller wants to see, item by item, whether spending went over budget.
- Drop
Iteminto Category,Planned budgetinto Start andActual spendinginto End. - Format › Gap direction › A decrease is favorable: on (spending less than planned is good).
- Format › Data colors › Coloring = By direction of the gap; Format › Dumbbells › Points › Hollow first point: on.
- Format › Gap › Content = Percentage.
Result: the plan is a ring, the actual a full point; an overrun reads "▲ +35%" in red, a saving "▼ −16%" in green. To gray out small gaps (● stable), set Format › Gap direction › Stability threshold ★ (premium feature).
How do I show the men / women pay gap year after year ★?
An HR director wants to see the gap narrow (or not) since 2018.
- Drop
Jobinto Category,Women's payinto Start,Men's payinto End, and theYearcolumn into Play axis ★. - Format › Sort › Sort by = Absolute gap.
- Format › Gap › Content = Percentage; Column title =
Men vs women. - Format › Data labels › Name the points on the first row: on; Format › Legend › Show: off.
- Click ▶ under the chart.
Result: each dumbbell slides to the next year's values and to its new rank; the current year is shown large in the background. The slider takes you back to any year. The play axis is premium (★, 22/10/2026 rebalancing): without a key it works with the "Premium preview" watermark. Without a play axis, filter one year (slicer) for a free static dumbbell.
How do I show one point per year (more than two points) ★?
You want 2019, 2020… 2025 on the same row.
- Create a table with one row per store and per year, and a measure
Sales = SUM ( History[Annual sales] ). - Drop
Storeinto Category,Yearinto Legend (one point each) andSalesinto Values (more points). - Format › Data labels › Show: off (too many points); Format › Dumbbells › Points › Size (px) =
9.
Result: one point per year, in a light-to-dark gradient (ordered legend), joined by a bar from the smallest to the largest; the gap column goes from the first to the last year. With only two years, it is free.
How do I know whether each store reached its target ★?
- Create the measure
Target 2025 = SUM ( Stores[Target 2025] )and drop it into Target ★. - Format › Target ★ › Mark the target as reached (✓) or missed (✗): on (default).
- For more readability: Last point colored by the target: on.
Result: a vertical tick marks the target on each dumbbell; the Gap column ends with ✓ or ✗. With "A decrease is favorable", the target is reached when you are below it.
How do I place each store within the market range ★?
- Create two measures,
Market lowandMarket high(for example the lowest and highest sales of comparable stores). - Drop them into Range minimum ★ and Range maximum ★.
- Set the look in Format › Range ★: color, opacity, thickness.
Result: a gray band behind each dumbbell; you see whether the store is at the low or high end of the range. With a play axis, Format › Range ★ › Historical range (play axis) ★ draws instead the lowest and highest value of the dumbbell over all years.
How do I add a logo or a flag to each category ★?
Microsoft-certified visuals never load web addresses: the image must be embedded in the model, in base64.
- Add a text column with the image in base64 (Power Query:
Binary.ToText ( File.Contents ( … ), BinaryEncoding.Base64 ), or an SVG converted to base64). - Create the measure
Logo = "data:image/png;base64," & SELECTEDVALUE ( Stores[Logo base64] )(ordata:image/svg+xml;base64,for an SVG). - Drop it into Category image ★.
- Format › Images ★ › Category image: position (Next to the name, Instead of the name, After the last point), size, shape (Round, Rounded corners, Square, Whole image (no crop)).
Result: the logo is shown next to the name. A web address (http…) is skipped, with a message in edit mode. For one image per point (one per year, per brand), use Point image ★ with a Legend.
How do I group the stores by region ★?
- Drop
Regioninto Group (parent category) ★. - Format › Groups ★ › Group average dumbbell: on.
- To rank the regions too: Format › Sort › Sort the groups too: on.
Result: one header per region, the average dumbbell in italics under it, then the stores sorted within their region, separated by a line.
How do I show only the largest changes?
- Format › Sort › Sort by = Absolute gap.
- Format › Sort › Show the first N (0 = all) =
10.
Result: the 10 largest increases or decreases, whatever the direction. To see the largest decreases only: Gap (end − start) and Order = Smallest first (names Z to A).
How do I drive the title with a DAX measure?
- Create the measure:
Dynamic title = "Sales 2025 vs 2024: " & FORMAT ( DIVIDE ( CALCULATE ( [Sales 2025], ALLSELECTED () ), CALCULATE ( [Sales 2024], ALLSELECTED () ) ) - 1, "+0.0%;-0.0%" ). - Drop it into Dynamic format, then right-click › Rename for this visual:
title.text.
Result: the title shows the change of the total, recalculated with every filter. All the keys you can drive are listed in the Dynamic formatting tutorial.
How do I drill down from a region to its stores?
With fifty stores, start with the regions, then drill down.
- Drag
Region, thenStore, into Category (one dumbbell each). One dumbbell per region: the sum of its stores. - Turn on drill mode (the ↓ arrow in the visual header), then click a region: its stores appear.
- To see everything, choose Expand all down one level (⇊): one dumbbell per store, named "South West Bristol".
Result: the same drill-down as in the native visuals; the gap, the direction colors and the sort follow each level. To keep regions as headers instead of drilling, use the Group (parent category) ★ field.
How do I keep the same scale when filtering?
A Region slicer removes the other stores: the value axis refits, and the dumbbells of two regions can no longer be compared. Pin the bounds with measures that ignore this filter.
- Create the measures:
Axis max =
CALCULATE ( MAX ( Stores[Sales 2025] ), REMOVEFILTERS ( Stores[Region] ) ) -- the highest sales, all regions
Axis min =
CALCULATE ( MIN ( Stores[Sales 2024] ), REMOVEFILTERS ( Stores[Region] ) )
- Drop them into Dynamic format, then rename them for this visual
valAxis.maxandvalAxis.min. - Pick a region: the axis no longer moves.
Don't use ALLSELECTED (): it follows slicers, so the scale would still move. REMOVEFILTERS ( Stores ) (or ALL ( Stores )) ignores every filter. If a store's highest sales are in 2024, take the maximum of both columns.