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

- Language: English
- Web page: https://plumevisuals.com/en/tutorials/dumbbell-plume-cas-pratiques
- Published: 2026-10-21
- Visual: Dumbbell Plume, technical reference: https://plumevisuals.com/ai/visuals/dumbbell.md
- If an option name in this tutorial differs from the technical reference, the reference is right (it is generated from the visual's code).

These recipes start from a Dumbbell Plume already in place. If you don't have one yet, start with the [getting started guide](/en/tutorials/dumbbell-plume-prise-en-main): 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](/en/tutorials/formats-dynamiques) 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:

```dax
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] ) )
```

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