Charts / CH-DEV-02
CH-DEV-02 . family DEV

DUMBBELL

two dots + connector per category: before and after. Needs: categories with a value at two moments; the movement is the message.

deviationchange-over-timecomparison

DL-01 AGRAW
System D is the only system where punch grew, 52 to 63 W24 W28 28 > 12 items System A 31 > 18 System B 39 > 25 System C 52 > 63 System D 36 > 31 System E Source: sample dataset v1, 2026-07-12

Use when

  • before/after per category: backlog W24 vs W28, score last year vs now
  • spotting the row that moved against the trend

Do not use when

  • more than two moments (CH-TIM-01)
  • two unrelated measures (CH-DST-02)

See instead

Alternatives

  • CH-TIM-05 (few categories, slope reads better)

Rules

  • before = dot_a muted, after = dot_b primary; the connector is the story
  • labels state both values: '52 > 63'
  • highlight the row moving against the trend

Never do this

  • arrows instead of connectors (double-encodes direction)
  • legends
  • sorting that hides the counter-mover

QA before delivering

  • both values labeled per row
  • series labeled on first row
  • highlight <= 1
  • source present

Data shape

titleaction title naming the mover with numbers
sourcebottom-left always
uniton first label
series_labels[before_name, after_name]
categoriesarray of {label, values: [before, after], highlight?}
Sample data (golden)
{
  "title": "System D is the only system where punch grew, 52 to 63",
  "eyebrow": "OPEN PUNCH . W24 VS W28",
  "source": "Source: sample dataset v1, 2026-07-12",
  "unit": "items",
  "series_labels": [
    "W24",
    "W28"
  ],
  "categories": [
    {
      "label": "System A",
      "values": [
        28,
        12
      ]
    },
    {
      "label": "System B",
      "values": [
        31,
        18
      ]
    },
    {
      "label": "System C",
      "values": [
        39,
        25
      ]
    },
    {
      "label": "System D",
      "values": [
        52,
        63
      ],
      "highlight": true
    },
    {
      "label": "System E",
      "values": [
        36,
        31
      ]
    }
  ]
}