Skip to content
Plume Visuals
← Back
How-to guidesIntermediate6 min read· Published on October 21, 2026

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çais

These 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.

  1. Drop Item into Category, Planned budget into Start and Actual spending into End.
  2. Format › Gap direction › A decrease is favorable: on (spending less than planned is good).
  3. Format › Data colors › Coloring = By direction of the gap; Format › Dumbbells › Points › Hollow first point: on.
  4. 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.

  1. Drop Job into Category, Women's pay into Start, Men's pay into End, and the Year column into Play axis ★.
  2. Format › Sort › Sort by = Absolute gap.
  3. Format › Gap › Content = Percentage; Column title = Men vs women.
  4. Format › Data labels › Name the points on the first row: on; Format › Legend › Show: off.
  5. 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.

  1. Create a table with one row per store and per year, and a measure Sales = SUM ( History[Annual sales] ).
  2. Drop Store into Category, Year into Legend (one point each) and Sales into Values (more points).
  3. 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 ★?

  1. Create the measure Target 2025 = SUM ( Stores[Target 2025] ) and drop it into Target ★.
  2. Format › Target ★ › Mark the target as reached (✓) or missed (✗): on (default).
  3. 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 ★?

  1. Create two measures, Market low and Market high (for example the lowest and highest sales of comparable stores).
  2. Drop them into Range minimum ★ and Range maximum ★.
  3. 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.

  1. Add a text column with the image in base64 (Power Query: Binary.ToText ( File.Contents ( … ), BinaryEncoding.Base64 ), or an SVG converted to base64).
  2. Create the measure Logo = "data:image/png;base64," & SELECTEDVALUE ( Stores[Logo base64] ) (or data:image/svg+xml;base64, for an SVG).
  3. Drop it into Category image ★.
  4. 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 ★?

  1. Drop Region into Group (parent category) ★.
  2. Format › Groups ★ › Group average dumbbell: on.
  3. 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?

  1. Format › Sort › Sort by = Absolute gap.
  2. 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?

  1. Create the measure: Dynamic title = "Sales 2025 vs 2024: " & FORMAT ( DIVIDE ( CALCULATE ( [Sales 2025], ALLSELECTED () ), CALCULATE ( [Sales 2024], ALLSELECTED () ) ) - 1, "+0.0%;-0.0%" ).
  2. 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.

  1. Drag Region, then Store, into Category (one dumbbell each). One dumbbell per region: the sum of its stores.
  2. Turn on drill mode (the ↓ arrow in the visual header), then click a region: its stores appear.
  3. 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.

  1. 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] ) )
  1. Drop them into Dynamic format, then rename them for this visual valAxis.max and valAxis.min.
  2. 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.