# SmartVisuals Tornado for Power BI

> A real sensitivity tornado for Power BI: bars swing around your base case, sorted by swing. Plus butterfly, population pyramid and diverging stacked bars.

- Page: https://www.smartvisuals.io/visuals/tornado-chart
- Fields and settings: https://www.smartvisuals.io/visuals/tornado-chart/settings
- Microsoft Marketplace: https://marketplace.microsoft.com/en-us/product/smartvisuals.smartvisuals-tornado?tab=overview
- Package: https://www.smartvisuals.io/downloads/smartvisuals-tornado-chart-1.0.1.0.pbiviz
- Sample report (zipped .pbip): https://www.smartvisuals.io/samples/smartvisuals-tornado-chart-sample-1.0.1.0.zip
- Price: Free tier for every viewer; premium $1.99 per user per month or $19 per user per year on Microsoft Marketplace, with a 30-day free trial. Premium works in edit mode without a licence; unlicensed viewers see the free tier, never a blocked visual.
- Certified by Microsoft: yes
- Version: 1.0.1.0
- GUID (visualType and publicCustomVisuals): `smartVisualsTornadoC3E81B5F2A9D4E7B8F16A0D4C92E57B1`

## What is free

- **Sensitivity tornado with up to 5 drivers**: Base line with label, swing sort, input assumptions with per-driver units, change vs base in value or %, swing column and a materiality threshold.
- **Colour that carries meaning**: Colour by effect (worse or better than base, with a lower-is-better switch for costs) or by input (low or high), with optional hatching so direction never depends on colour alone.
- **Butterfly and population pyramid in full**: Two measures or one measure split by a field, category labels in the centre spine, % of grand total, of each side or of each row, winner emphasis and independent scales per side.
- **A pyramid that knows it is a pyramid**: Age bands split by Male / Female draw as a population pyramid on the first drop: oldest band on top, men on the left. The Pyramid sort does the same for any banded data.
- **Diverging stacked bars**: Losses left of zero, gains right, with a net marker, or survey answers with the first series on the left and a neutral split at zero.
- **Sorting, Top N and drill-down**: Sort by swing, value, total, difference or name; Top N with Others; drill-down hierarchies on the category.
- **Native Power BI behaviour**: Four themes with their own personality, colours per category with conditional formatting, cross-filtering, tooltips and report-page tooltips, keyboard navigation, high contrast and five languages.

## What premium adds

- **More than 5 drivers**: Sensitivity analysis with every driver your model flexes. Without a licence, readers see the 5 widest drivers and a note, never a blocked chart.
- **Reference overlay**: Last quarter's analysis, prior year or budget drawn as an outline, tick or ghost bar behind the current one.
- **Small multiples**: One tornado or pyramid per project, plant or region, with a shared scale or each panel on its own.
- **Share-of-variance and cumulative columns**: Analytics columns beside the sensitivity tornado that show how much of the total variance each driver explains.
- **Butterfly difference column**: The difference and difference % between the two sides, row by row.

## Fields

| Field | Internal name | Takes | Needed | What it is for |
| --- | --- | --- | --- | --- |
| Category | `category` | Column | Optional, up to 3 | One bar per category: the driver of a sensitivity analysis, the age band of a pyramid, the product of an A-vs-B comparison. Add a hierarchy to drill. |
| Left / low case | `left` | Measure | Optional | Butterfly: the left-hand value (Male, Lost, Plan). Sensitivity: the output when the driver is at its low input. |
| Right / high case | `right` | Measure | Optional | Butterfly: the right-hand value (Female, Won, Actual). Sensitivity: the output when the driver is at its high input. |
| Base case | `base` | Measure | Optional | The output at base assumptions. Binding it turns on the sensitivity tornado: every bar swings around the base. |
| Value (with Split by) | `value` | Measure | Optional | One measure split into sides by the Split by field, e.g. Headcount split by Gender. |
| Split by | `series` | Column | Optional | Splits Value: 2 values = the two sides of a butterfly or pyramid; 3 or more = diverging stacked bars, negative values to the left. |
| Low input | `lowInput` | Measure | Optional | Sensitivity: the driver's low input assumption (number or text), shown at the bar end. |
| High input | `highInput` | Measure | Optional | Sensitivity: the driver's high input assumption, shown at the bar end. |
| Base input | `baseInput` | Measure | Optional | Sensitivity: the driver's base input assumption, for tooltips and the label line. |
| Input unit or format | `inputUnit` | Measure | Optional | Per-driver unit (€/t, %, months) or format string (0.0%) for the input assumptions. Use First on a text column. |
| Reference left / low | `refLeft` | Measure | Optional | A comparison drawn over the bars as an outline or tick: prior year, budget, last quarter's run. With Split by, this one field is the reference for both sides. |
| Reference right / high | `refRight` | Measure | Optional | The right-hand / high-case comparison value. |
| Small multiples | `group` | Column | Optional | One chart per value (project, plant, region) on a shared scale. |
| Tooltips | `tooltips` | Measure | Optional, up to 5 | Extra measures shown in the tooltip. |

## Format pane

Each card is a key under `visual.objects` in a PBIR visual.json; each setting is a property of it. Toggles take `true`/`false`, choices and text a value in single quotes (`'auto'`), numbers a `D` suffix (`12D`).

### Theme (`theme`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Theme | `selectedTheme` | `smartvisuals` (SmartVisuals), `dark` (Dark), `clean` (Clean (White)), `slate` (Slate) |
| Font | `fontFamily` | `inter` (Inter), `segoe` (Segoe UI), `arial` (Arial), `georgia` (Georgia) |
| Transparent background | `transparentBg` | On / off |
| Background color | `bgColor` | Colour |
| Row style | `rowStyle` | `theme` (Theme), `none` (None), `zebra` (Zebra stripes), `cards` (Cards), `rules` (Hairline rules) |
| Row band color | `rowColor` | Colour |

### Chart (`chart`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Chart type | `chartType` | `auto` (Auto (from the fields)), `sensitivity` (Sensitivity tornado), `butterfly` (Butterfly / pyramid), `diverging` (Diverging stacked) |
| Sort drivers by | `sortSensitivity` | `swing` (Swing (widest first)), `downside` (Largest downside), `upside` (Largest upside), `low` (Low-case output), `high` (High-case output), `name` (Name), `data` (Data order) |
| Sort by | `sortButterfly` | `auto` (Auto (pyramid for age bands by sex)), `pyramid` (Pyramid (oldest on top)), `data` (Data order), `name` (Name), `left` (Left value), `right` (Right value), `total` (Total), `diff` (Difference (right − left)), `absDiff` (Size of difference) |
| Sort by | `sortDiverging` | `data` (Data order), `name` (Name), `net` (Net), `positive` (Positive total), `negative` (Negative total), `span` (Total span) |
| Direction | `sortDirection` | `auto` (Auto), `asc` (Ascending), `desc` (Descending) |
| Show top N (0 = all) | `topN` | Number |
| Group the rest as Others | `showOthers` | On / off |
| Row height (0 = fit) | `rowHeight` | Number |
| Swap sides | `swapSides` | On / off |

### Sensitivity (`sensitivity`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Color by | `colorBy` | `effect` (Effect (worse / better than base)), `input` (Input (low / high)) |
| Output polarity | `polarity` | `higher` (Higher output is better), `lower` (Lower output is better) |
| Notation | `notation` | `standard` (Standard), `ibcs` (IBCS (green / red impact)) |
| Base from this number | `useConstantBase` | On / off |
| Base value | `baseValue` | Number |
| Hide swings below (% of base) | `threshold` | Number |

### Butterfly & pyramid (`butterfly`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show as percent | `percentBase` | `none` (Off (values)), `total` (% of grand total), `side` (% of each side), `row` (% of each row) |
| Scale | `scale` | `shared` (Shared (honest)), `independent` (Independent per side) |
| Category labels | `placement` | `spine` (Centre spine), `left` (Left edge) |
| Difference column | `difference` | `none` (Off), `abs` (Difference), `pct` (Difference %), `both` (Difference and %) |
| Emphasize the larger side | `emphasizeLarger` | On / off |
| Side headers | `showSideHeaders` | On / off |
| Totals in headers | `showSideTotals` | On / off |
| Smaller side opacity % | `emphasisOpacity` | Number |
| Difference up marker | `diffUpColor` | Colour |
| Difference down marker | `diffDownColor` | Colour |

### Diverging (`diverging`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Series on the left (0 = by sign) | `leftSeries` | Number |
| Split the next series at zero (neutral) | `neutral` | On / off |
| Net marker color | `netColor` | Colour |

### Bars (`bars`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Bar thickness % (0 = theme) | `thickness` | Number |
| Bar ends | `shape` | `theme` (Theme), `square` (Square), `rounded` (Rounded), `pill` (Pill) |
| Worse than base | `worseColor` | Colour |
| Better than base | `betterColor` | Colour |
| Low input | `lowColor` | Colour |
| High input | `highColor` | Colour |
| Left side | `leftColor` | Colour |
| Right side | `rightColor` | Colour |
| Shorter bar (one-sided drivers) | `innerColor` | Colour |
| Accessible hatching (worse side / high input) | `pattern` | On / off |

### Category colors (`dataPoint`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Color | `fill` | Colour |

### Series colors (`seriesColors`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Color | `fill` | Colour |

### Base line (`baseLine`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show base line | `show` | On / off |
| Color | `color` | Colour |
| Width (0 = theme) | `width` | Number |
| Style | `style` | `theme` (Theme), `solid` (Solid), `dashed` (Dashed), `dotted` (Dotted) |
| Base label | `showLabel` | On / off |
| Label text (empty = Base) | `labelText` | Text |
| Label font size | `labelFontSize` | Number |
| Label text color | `chipTextColor` | Colour |

### Data labels (`labels`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show data labels | `show` | On / off |
| Content | `sensContent` | `delta` (Change vs base), `value` (Output value), `pct` (% change vs base), `valueDelta` (Value and change), `deltaPct` (Change and %) |
| Content | `bfContent` | `value` (Value), `pct` (Percent), `valuePct` (Value (percent)) |
| Labels inside segments | `showSegmentLabels` | On / off |
| Net marker and label | `showNet` | On / off |
| Font size | `fontSize` | Number |
| Color | `color` | Colour |
| Display units | `displayUnits` | `auto` (Auto), `none` (None), `K` (Thousands), `M` (Millions), `B` (Billions), `T` (Trillions) |
| Decimals (-1 = auto) | `decimals` | Number |
| Percent decimals | `pctDecimals` | Number |

### Input assumptions (`inputs`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show input assumptions | `show` | On / off |
| Position | `position` | `ends` (At the bar ends), `name` (Under the name), `both` (Both) |
| Include base input | `showBase` | On / off |
| Font size | `fontSize` | Number |
| Color | `color` | Colour |

### Category labels (`categoryLabels`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show category labels | `show` | On / off |
| Font size | `fontSize` | Number |
| Color | `color` | Colour |
| Weight | `weight` | `theme` (Theme), `regular` (Regular), `bold` (Bold) |
| Max width (0 = auto) | `maxWidth` | Number |

### Legend (`legend`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show legend | `show` | On / off |
| Position | `position` | `top` (Top), `bottom` (Bottom) |
| Alignment | `alignment` | `center` (Center), `left` (Left), `right` (Right) |
| Font size | `fontSize` | Number |
| Color | `color` | Colour |

### Headers (`headers`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Font size | `fontSize` | Number |
| Color | `color` | Colour |

### Axis & gridlines (`axis`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Axis labels | `show` | On / off |
| Gridlines | `gridlines` | On / off |
| Zero / centre line | `centerLine` | On / off |
| Zero / centre line color | `centerLineColor` | Colour |
| Zero / centre line width | `centerLineWidth` | Number |
| Gridline style | `gridStyle` | `theme` (Theme), `solid` (Solid), `dashed` (Dashed), `dotted` (Dotted) |
| Font size | `fontSize` | Number |
| Label color | `color` | Colour |
| Gridline color | `gridColor` | Colour |
| Fixed axis range | `fixedRange` | On / off |
| Axis start | `axisMin` | Number |
| Axis end | `axisMax` | Number |

### Reference (`reference`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Show reference | `show` | On / off |
| Style | `style` | `outline` (Outline), `tick` (Tick), `ghost` (Ghost bar) |
| Color | `color` | Colour |
| Line width | `width` | Number |
| Legend label (empty = field name) | `label` | Text |

### Analytics columns (`columns`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Swing | `showSwing` | On / off |
| Share of variance | `showVariance` | On / off |
| Cumulative share | `showCumulative` | On / off |
| Font size | `fontSize` | Number |
| Color | `color` | Colour |

### Smart insights (`insights`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Insight sentence | `show` | On / off |
| Notes (hidden rows, scales) | `showNotes` | On / off |
| Notes font size | `notesFontSize` | Number |
| Notes color | `notesColor` | Colour |
| Font size | `fontSize` | Number |
| Color | `color` | Colour |

### Small multiples (`multiples`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Columns (0 = auto) | `columns` | Number |
| Scale across panels | `scale` | `auto` (Auto), `shared` (Shared), `independent` (Independent per panel) |
| Same row order in every panel | `sameOrder` | On / off |
| Panel titles | `showTitles` | On / off |
| Title font size | `titleFontSize` | Number |
| Title color | `titleColor` | Colour |
| Panel frames | `showBorders` | On / off |
| Frame color | `borderColor` | Colour |

### Accessibility (`accessibility`)

| Setting | Internal name | Type or options |
| --- | --- | --- |
| Focus outline color | `focusColor` | Colour |
| Focus outline width (0 = theme) | `focusWidth` | Number |
| Minimum text size (0 = off) | `minFontSize` | Number |
| Hatching, not color alone (worse side / high input) | `pattern` | On / off |
