Chord diagram for Power BI Chord Plume
Who exchanges with whom, both ways: a readable chord diagram, with labels that never overlap and years replayed with animation.
Interactive demo
The real Power BI visual, running in your browser with the sample report's fictitious data. Switch scenario, style or year: the visual updates as it does in Power BI. Premium ★ features are shown here without the watermark; in Power BI, without a license, they show “Plume Visuals · Premium preview”.
Chord Plume places your names (regions, countries, teams, brands) as arcs around a circle and links each pair with a ribbon whose ends are as wide as what each side sends: you see at a glance which way each exchange leans. Drop a From column, a To column and a measure, or a matrix (one measure per destination). Labels place themselves along the arcs, horizontally or radially, and never overlap; small names join Others. With premium: the play axis (the diagram replayed from one year to the next with animated transitions), two half circles (origins on the left, destinations on the right), a sent / received, net balance or change ring, net balance or fewer-crossings order, groups (countries by continent), small ribbons hidden, ticks in %, highlight, stronger-direction and gradient ribbons.
Use cases
- Moves between regions, migration between countries, commuting
- Trade: exporters and importers, suppliers and customers
- Staff moves and shared work between teams, budget transfers
- Customers switching from one offer or brand to another
FreeIncluded for free
- From, To, Value fields; or a matrix: without To, one measure per destination
- Both ways in one ribbon (each end = what it sends), one ribbon per direction with an arrow, or undirected
- Labels along the arcs, radial or horizontal with leader lines, never overlapping; name, value, % of total
- Order: largest first, alphabetical, data order, custom list
- Others beyond N names, self-loops, ticks in values
- Hover an arc (sent, received or both), cross-filtering, highlighting, tooltips with the net balance
- Bold or italic labels and ticks, straight or rotated ticks, ribbon outline, "Sort axis"
- Dynamic formats: fx button on colors and texts, any option driven by DAX
PremiumPremium features
- Play axis: one period per frame, animated transitions, arcs keep their place and color
- Two half circles: origins on the left, destinations on the right
- Indicator ring: sent and received, net balance ▲ ▼, change since a reference period
- Net balance order (gainers first) or fewer crossings
- Small ribbons hidden, ticks in % of total, ribbons colored by the stronger direction
- Groups: countries by continent, teams by division, with a named outer arc
- Highlighted names, gradient ribbons; catalog-wide styles, palettes, theme JSON
Usable without a key to try them, with a watermark.
Tutorials
Start with Getting started, then pick from the how-to guides. The Fields and settings page describes every option of the Format pane.
- Getting startedBeginner6 min readChord diagram in Power BI: who exchanges with whom, both waysGet started with Chord Plume: prepare a From / To / Value table, insert the visual, read the ribbons, isolate a name's flows and pick the year to show.
- How-to guidesIntermediate4 min readChord Plume: 9 use cases for readable chord diagramsExcel matrix, many names, arrows per direction, arc order, play axis, two half circles, net balance, groups and highlight: the Chord Plume recipes.
- Fields and settingsIntermediate10 min readChord Plume: every field and setting explainedEvery field well and every Format pane setting of Chord Plume: what it does, its possible values and its default value, premium features included.
- BasicsGetting started with Plume visualsInstallation, license, styles and the settings shared by every visual.
Fields to drop into the visual
| Field | Content | |
|---|---|---|
| From | Origin of each flow: one arc per value | Required |
| To | Destination of each flow (without To: one measure per destination) | Optional |
| Value (or one measure per destination) | A measure (ribbon width), or one measure per destination for a matrix | Optional |
| Play axis | Year, month: diagram replayed with animated transitions | OptionalPremium |
| From group, To group | Continent, division: arcs grouped under an outer arc | OptionalPremium |
| Tooltips | Extra measures | Optional |
| Dynamic format | Measures renamed card.setting (e.g. title.text): the Format pane driven by DAX | Optional |
Missing a feature? We adapt our visuals or build custom ones. Request a custom visual
Found a bug in Chord Plume, or have an idea to improve it? Report a bug · Suggest an idea
Technical reference for AI assistants
This section is meant for AI assistants (ChatGPT, Claude, Copilot…): every field, every Format pane option with its internal name, the expected data shape and DAX examples. Generated from the visual's code, version 1.1.0.0. Paste it into your assistant so it can guide you.
Raw Markdown version (/ai/visuals/chord.md)# Chord Plume: technical reference for AI assistants
> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.1.0.0**. This page is generated from the visual's source code at each site build: field names, option names and defaults are exact for this version.
Use it to help someone build a report with Chord Plume: which fields to drag, how to shape the data, which Format pane option to change, or how to write the visual's settings in a PBIP `visual.json` file.
- Product page: https://plumevisuals.com/en/visuals/chord (French: https://plumevisuals.com/fr/visuels/chord)
- Summary: Who exchanges with whom, both ways: a readable chord diagram, with labels that never overlap and years replayed with animation.
- Power BI visual GUID (`visualType`): `plumeChordC66BF01D5AA54B1F91E8D1DA4CFB6000`
- Power BI visuals API: 5.11.1
- Support: https://plumevisuals.com/support · contact@plumevisuals.com
- Index of everything on the site for AI assistants: https://plumevisuals.com/llms.txt
## What the visual does
Chord Plume (identifier `chord`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; not yet on AppSource) that draws **chord diagrams**: names (regions, countries, teams, brands) as arcs around a circle, and one ribbon per pair of names showing what they exchange. Power BI Desktop has no native chord diagram (only Microsoft's older free "Chord" custom visual).
**New in version 1.1.0.0 (30/10/2026):** Format pane reorganized (`labels.*` → `categoryLabels.*`); free parity with Microsoft's Chord: bold / italic category labels, bold / italic / rotated ticks, ribbon outline color and width, axis sort.
- **Both directions**: with `layout.direction` = `both` ("Both ways in one ribbon"), each end of a ribbon is as wide as what its arc sends to the other (asymmetric ribbon) and the arc length is what the name sends; `arrows` draws one ribbon per direction with an arrowhead at the destination (arc = sent + received); `undirected` adds both directions (equal ends). `auto` (default) picks `both` when every name sends something, otherwise `arrows` (a name that only receives would have no arc).
- **Two kinds of data**: one row per flow (From, To, Value), or a **matrix**: no To field and two or more measures in Value, each measure being a destination named after the measure.
- **Labels never overlap**: along the arcs (curved), radial, or horizontal with leader lines; `auto` puts each label along its arc when it fits, otherwise horizontal (wide visual) or radial; labels that still do not fit are shortened (…) or left out, largest arcs first.
- **Busy data**: the names with the most traffic (sent + received) keep their arc, the rest is merged into a gray "Others" arc (`layout.maxGroups`, 20); small ribbons can be hidden ★ (`flows.minShare`); self-flows (A → A) drawn as loops or hidden; ticks in values or % of total ★.
- **Order**: largest first, alphabetical, data order (respects Sort by column), custom list, fewer crossings ★ (partners side by side), net balance ★. Ribbon ends inside each arc are ordered by the position of the partner, which avoids crossings.
- **Play axis ★**: one diagram per period (dates and numbers sorted, text in data order), most recent period shown first, animated transitions between periods; arcs keep their place and color over all periods (order, Others and colors are computed on the whole data).
- Premium ★: two half circles (`layout.shape` = `bipartite`: From on the left, To on the right), indicator ring (`ring.kind` = `inout` sent / received, `net` net balance ▲▼, `change` change since the previous or first period), net balance and fewer-crossings orders, groups (From group / To group fields: grouped arcs under a named outer arc, color shades), highlighted names (`flows.focus`), gradient ribbons, ribbons colored by the stronger direction, small ribbons hidden, ticks in % of total, and the play axis (since the 22/10/2026 rebalancing).
## Free vs premium (★)
- Every feature works without a key and nothing is ever blocked. Free features never show a watermark.
- Shared Style card (the same in every Plume visual): the styles `none`, `minimal` and `blackWhite`, the two Plume gradient palettes (`crest`, `crestDiverging`), "Follow report theme" and all custom colors are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium**.
- Free in Chord Plume: circle shape, matrix of measures, all flow directions, colors by origin / destination / neutral, all label placements and contents, ticks in values, Others, self-loops, orders size / alpha / data / custom, hover modes, selection, highlighting, tooltips.
- Premium features of Chord Plume: the Play axis field with at least one value (« Axe de lecture ★ », card « Lecture ★ » / « Playback ★ »); `layout.shape` = `bipartite`; `layout.order` = `net`, or `auto` with at least 3 names; `flows.colorBy` = `gradient`, or `dominant` with one ribbon per direction or two half circles; `flows.minShare` when at least one ribbon is actually hidden; `ticks.unit` = `percent` with ticks shown; `flows.focus` (any name); `ring.kind` = `inout`, `net` or `change` (change only counts when a Play axis field is present); the From group / To group fields with at least one value.
- Without a valid key, a premium feature in use shows, in edit mode, a "Premium preview" note in the footer; in reading view, **"Plume Visuals · Premium preview"** (French « Plume Visuals · Aperçu premium ») is repeated lightly across the whole visual, without catching the mouse. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`), the **first card** of the Format pane. Premium options and list values have " ★" appended to their label.
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `chord` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual".
- Licenses last one year (one-time payment, no automatic renewal). Prices: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog pack.
## Expected data shape
One row per flow, with a measure for the size.
| From (`source`) | To (`target`) | Play axis (`play`) | Value (`value`) |
|---|---|---|---|
| Île-de-France | Nouvelle-Aquitaine | 2025 | 5,540 |
| Nouvelle-Aquitaine | Île-de-France | 2025 | 1,540 |
- **From** (`source`, « De », one column, required): one arc per value. A name found in From and To is a single arc (circle shape).
- **To** (`target`, « Vers », one column): required unless the Value well holds two or more measures (matrix).
- **Value** (`value`, « Valeur (ou une mesure par destination) », 1 to 30 measures): rows of the same pair are added up; without a measure each row counts as 1 (a hint says so); negative values are left out with a warning icon; blanks ignored.
- **Play axis ★** (`play`, « Axe de lecture ★ », one column): one diagram per value; premium (watermark without a key, never blocked).
- **From group ★** / **To group ★** (`sourceGroup`, `targetGroup`, one column each): group of each origin / destination (continent, division).
- **Tooltips** (`tooltips`, up to 5 measures) and **Dynamic format** (`format`, see below).
- Volume of data: windows of 30,000 rows, more fetched with `fetchMoreData`; 100,004 rows (60 names, 28 periods) render in well under 2.5 s.
## DAX recipes
```dax
// One row per flow: a simple sum
People moving = SUM ( Moves[People] )
// Matrix (one column per destination): one measure per column, named after the destination
Sales = SUM ( 'Shared work'[To Sales] )
Marketing = SUM ( 'Shared work'[To Marketing] )
// Dynamic title (renamed title.text in the Dynamic format well)
Dynamic title = "Moves between regions: " & FORMAT ( CALCULATE ( [People moving], ALLSELECTED () ), "#,0" ) & " people"
```
To compare two periods without the play axis, filter the visual on one year and use the tooltip; with the play axis, `ring.kind` = `change` ★ shows the change since the previous or first period.
## Interactions with the report
- Hover an arc: its ribbons stay sharp, the others are dimmed (`interaction.hoverFlows`: `both`, `out` sent only, `in` received only). Hover a ribbon: that ribbon.
- Click an arc: cross-filter on all its flows (every From + To combination of its ribbons, up to 5,000 identities); click a ribbon: the pair (both directions in one ribbon, or one direction with arrows); Ctrl + click adds; click empty space clears. Cross-highlighting from other visuals is drawn as the highlighted part at the start of each ribbon end and arc. Context menu everywhere (arcs, ribbons, empty space, labels, title, landing page).
- Tooltips: arc = name, period, group, sent, received, internal, net balance (▲ / ▼), share of total, change since the reference period, highlighted; ribbon = A → B, B → A, net balance, share of what A sends, Tooltips measures. Report-page tooltips are supported.
- Keyboard: Tab to the chart, arrows move from arc to arc then ribbon to ribbon (announced to screen readers), Enter selects, Esc clears. High contrast: ribbons drawn as host-colored strokes, arcs and ring in host colors. French and English.
- The visual never calls `persistProperties`: every setting comes from the Format pane.
## Dynamic formats
- **fx button** (Power BI conditional formatting) on colors and texts of the Format pane, and on each name's color in Data colors.
- **"Dynamic format" well** (`format`): measures renamed `card.setting` (e.g. `title.text`, `layout.order`, `flows.focus`, `ring.kind`) drive any setting and win over the fixed value. Driving a ★ setting by DAX still shows the watermark without a key. These measures never become flows.
## Format pane: option IDs
- Card order: `license`, `style`, `dataColors`, `layout`, `flows`, `ring`, (`groups` with a group field), `categoryLabels`, `ticks`, `interaction`, then `play` (shared player card) when the Play axis field is used, then `title`, `source`, `container`, `texts`. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `layout`, `dataColors`, `flows`, `ring`, `groups`, `categoryLabels`, `ticks`, `play`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `dataColors`: `mode` (`auto` | `single`), `single`, `fill` (per name).
- `layout`: `shape` (`circle` | `bipartite` ★), `direction` (`auto` | `both` | `arrows` | `undirected`), `order` (`size` | `auto` ★ | `alpha` | `data` | `custom` | `net` ★), `customOrder` (text, `;`-separated), `startAngle` (0–359, 0), `clockwise` (true), `padAngle` (0–20 degrees, 2), `arcWidth` (2–60 px, 12), `size` (40–100 %, 100), `maxGroups` (2–60, 20), `selfLoops` (`show` | `hide`).
- `flows`: `colorBy` (`source` | `target` | `dominant` ★ | `gradient` ★ | `neutral`), `opacity` (5–100, 68), `outline` (true), `arrowSize` (0–40 px, 10), `minShare` ★ (0–20 % of total, 0), `focus` ★ (text, `;`-separated names), `dimOpacity` (5–100, 30).
- `ring`: `kind` (`none` | `inout` ★ | `net` ★ | `change` ★), `reference` (`previous` | `first`), `width` (3–40 px, 10), `values` (true).
- `groups` ★: `show` (true), `gap` (0–30 degrees, 6), `shades` (true), `fontSize` (9).
- `categoryLabels`: `show`, `placement` (`auto` | `curved` | `radial` | `horizontal`), `content` (`name` | `nameValue` | `namePct` | `all`), `fontSize` (10), `color`, `maxWidth` (10–45 %, 25), `halo`, `units`, `decimals`, `prefix`, `suffix`.
- `ticks`: `show` (false), `unit` (`value` | `percent` ★), `step` (0 = automatic), `fontSize` (8), `color`.
- `interaction`: `hover` (true), `dim` (5–80, 25), `hoverFlows` (`both` | `out` | `in`).
- `play` ★ (shared Plume player, card « Lecture ★ », shown with a Play axis field; session state only, never saved): `start` (`last` | `first`), `speed` (100–10000 ms per frame, 1000), `loop` (false), `autoPlay` (false), `transition` (true), `controls` (true), `position` (`bottom` | `top`), `ticks` (`auto` | `all` | `none`), `tickLabels`, `stepButtons`, `speedButton`, `showLabel` (true), `labelSize` (12–160, 44), `labelPosition` (`bottomRight` | `topRight` | `topLeft` | `bottomLeft` | `center`). Play bar: play / pause, slider, start / end buttons, speed ×0.5 to ×4; keyboard Space, arrows, Page Up / Down, Home / End.
## Editing a PBIP report (visual.json)
`visualType` is the visual GUID, `queryState` keys are the data role names, `objects` keys are the option IDs. Booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes.
```json
{
"visualType": "plumeChordC66BF01D5AA54B1F91E8D1DA4CFB6000",
"query": {
"queryState": {
"source": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Moves" } }, "Property": "Origin region" } }, "queryRef": "Moves.Origin region", "nativeQueryRef": "Origin region" } ] },
"target": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Moves" } }, "Property": "Destination region" } }, "queryRef": "Moves.Destination region", "nativeQueryRef": "Destination region" } ] },
"value": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Moves" } }, "Property": "People moving" } }, "queryRef": "Moves.People moving", "nativeQueryRef": "People moving" } ] },
"play": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Moves" } }, "Property": "Year" } }, "queryRef": "Moves.Year", "nativeQueryRef": "Year" } ] }
}
},
"objects": {
"layout": [ { "properties": { "order": { "expr": { "Literal": { "Value": "'auto'" } } }, "maxGroups": { "expr": { "Literal": { "Value": "12D" } } } } } ],
"ring": [ { "properties": { "kind": { "expr": { "Literal": { "Value": "'net'" } } } } } ]
}
}
```
The custom visual package must also be embedded in the report (Power BI does this when the visual is imported from the `.pbiviz` file).
## Styles and theme JSON
- `style.preset` takes one of the 20 style IDs shared by every Plume visual: `none`, `minimal`, `blackWhite`, `press`, `vintage`, `earth`, `nordic`, `executive`, `accessible`, `pastel`, `bauhaus`, `climate`, `blueprint`, `unknownPleasures`, `dark`, `neon`, `terminal`, `infographic`, `cockpit`, `hologram`. Style-specific defaults: Minimal = thin arcs, no ribbon outline; Unknown Pleasures = neutral ribbons; Neon, Graphite, Hologram = more opaque ribbons and glow.
- `style.themeJson` (Theme JSON ★): a JSON theme as plain text (format v2 with optional `extends` and groups `colors`, `palettes`, `typography`, `shape`, `table`, `marks`, `effects`). Full reference: https://plumevisuals.com/ai/tutorials/en/themes-json.md.
## Common pitfalls
- A name has two arcs: it is spelled differently in From and To (space, accent, case), or the shape is two half circles (by design).
- Pointed ribbons with no width on one side: the flow only goes one way (both-ways mode); use `arrows` if preferred.
- The landing page asks for "To": From and a single measure only; add To or a second measure (matrix).
- "Without Value, each From → To row counts as 1": no measure in Value.
- A gray "Others" arc: more names than `layout.maxGroups`.
- The "Change" ring draws nothing: no Play axis field (a hint says so; no watermark then).
- Watermark visible: a Play axis field, two half circles, net balance or fewer-crossings order, gradient or stronger-direction ribbons, hidden small ribbons, ticks in %, a highlighted name, an indicator ring, a group field, a ★ style or a theme JSON, without a valid key.
- The visual makes no network request: data and license key stay in the report.
## Features that do NOT exist (do not suggest them)
Ribbon color driven by a measure, value labels written on the ribbons, dragging arcs to reorder them, zooming into a group on click, images or flags at the end of the arcs, two diagrams side by side for a comparison, hierarchical edge bundling, network (force-directed) layouts, exporting the chart as an image.
## Data fields (wells)
Internal name = data role name (PBIP `queryState` key). Labels as shown in Power BI (English / French). ★ = premium.
| Internal name | Label (EN) | Label (FR) | Kind | Max fields | Description |
|---|---|---|---|---|---|
| `source` | From | De | column | 1 | Origin of each flow (country, department, product…). With To: one flow per row. |
| `target` | To | Vers | column | 1 | Destination of each flow. Without To, drop several measures in Value: each measure is a destination (matrix). |
| `value` | Value (or one measure per destination) | Valeur (ou une mesure par destination) | measure | 30 | Size of the flows. Without To, each measure is a destination named after the measure (matrix of measures). |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | Premium: year, month…: one diagram per value, played with animated transitions. |
| `sourceGroup` | From group ★ | Groupe de De ★ | column | 1 | Premium: group of each From item (continent, division…): grouped arcs with an outer ring. |
| `targetGroup` | To group ★ | Groupe de Vers ★ | column | 1 | Premium: group of each To item (often the same field as From group, from the destination table). |
| `tooltips` | Tooltips | Infobulles | measure | 5 | |
| `format` | Dynamic format | Format dynamique | measure | several | Measures named card.setting (e.g. title.fontSize): drive any Format option with DAX |
Data view: categorical, categories = `source` + `target` + `play` + `sourceGroup` + `targetGroup` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `value`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).
## Format pane options (138)
Columns: option ID (`object.property`), labels EN / FR as shown in Power BI, control type, PBIP literal type, default value, allowed values, notes.
### Plume Studio License / Licence Plume Studio (`license`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `license.buy` | Get a license | Obtenir une licence | info | text | `plumevisuals.com` | | |
| `license.key` | License key | Clé de licence | text | text | (empty) | | Paste the key received after purchase on plumevisuals.com (starts with PLUM1.). Checked offline. |
| `license.showOwner` | Show license holder (edit mode) | Afficher le titulaire (mode édition) | toggle | bool | `true` | true / false | |
### Style (`style`, Format pane)
**Style**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.preset` | Style | Style | dropdown | enumeration | `none` | `none` None; `minimal` Minimal; `blackWhite` Black & White; `press` Newspaper ★; `vintage` Vintage (antique plate) ★; `earth` Earth ★; `nordic` Nordic ★; `executive` Executive ★; `accessible` Accessible (high legibility) ★; `pastel` Pastel ★; `bauhaus` Bauhaus (pop) ★; `climate` Climate ★; `blueprint` Blueprint ★; `unknownPleasures` Unknown Pleasures ★; `dark` Graphite (dark) ★; `neon` Neon ★; `terminal` Terminal (Matrix) ★; `infographic` Infographic ★; `cockpit` Cockpit (HUD) ★; `hologram` Hologram ★ | Complete look shared by all Plume visuals: colors, three palettes, fonts, frame, table header, marks and effects. Customize colors below. |
| `style.themeJson` | Theme JSON ★ | Thème JSON ★ | textarea | text | (empty) | | Paste a JSON theme: see the 'JSON themes' tutorial on plumevisuals.com |
| `style.followTheme` | Follow report theme | Suivre le thème du rapport | toggle | bool | `false` | true / false | Text, background, accent and data colors come from the Power BI report theme. |
| `style.reverse` | Reverse gradients | Inverser les dégradés | toggle | bool | `false` | true / false | |
**Custom colors / Couleurs personnalisées**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.customColors` | Customize colors | Personnaliser les couleurs | toggle | bool | `false` | true / false | Start from the style and pick your own colors. A color left empty keeps the style's color. |
| `style.colorBackground` | Background | Fond | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorText` | Text | Texte | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorMuted` | Secondary text | Texte secondaire | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorGrid` | Lines and grid | Traits et grille | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorAccent` | Accent | Accent | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorPositive` | Favorable | Favorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorNegative` | Unfavorable | Défavorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series1` | Series 1 | Série 1 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series2` | Series 2 | Série 2 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series3` | Series 3 | Série 3 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series4` | Series 4 | Série 4 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series5` | Series 5 | Série 5 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series6` | Series 6 | Série 6 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series7` | Series 7 | Série 7 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series8` | Series 8 | Série 8 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.palette` | Gradient palette | Palette du dégradé | dropdown | enumeration | `auto` | `auto` Style or theme palette; `crest` Plume (sequential); `crestDiverging` Plume (diverging); `viridis` Viridis ★; `magma` Magma ★; `inferno` Inferno ★; `cividis` Cividis (colorblind-safe) ★; `warmingStripes` Warming stripes ★; `rdYlBu` Red–Yellow–Blue ★; `brBG` Brown–Teal (drought) ★; `spectral` Spectral ★; `blues` Blues ★; `reds` Reds ★; `grays` Grays ★; `press` Press (ink and paper) ★; `nordic` Nordic ★; `earth` Earth (ochre to umber) ★; `pastel` Pastel ★; `okabeIto` Okabe-Ito (colorblind-safe) ★ | Visible when `style.customColors` = `true`. Gradient from the catalog (Viridis, Magma…). The start, middle and end colors below replace it. |
| `style.scaleLow` | Gradient: start | Dégradé : début | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleMid` | Gradient: middle (diverging) | Dégradé : milieu (écarts) | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleHigh` | Gradient: end | Dégradé : fin | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
**Text / Texte**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.fontFamily` | Font | Police | font | formatting | `Segoe UI, wf_segoe-ui_normal, helvetica, arial, sans-serif` | | Used by every text of the visual (title, axes, labels, cells). |
**Animations**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.animate` | Animations | Animations | toggle | bool | `true` | true / false | Smooth transitions when data changes. Automatically disabled when the system asks to reduce motion. |
### Layout / Disposition (`layout`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.shape` | Shape | Forme | dropdown | enumeration | `circle` | `circle` Circle (one arc per name); `bipartite` Two half circles (From on the left, To on the right) ★ | Two half circles: origins on the left, destinations on the right (exporters and importers, channels and products). A name found on both sides gets two arcs. |
| `layout.direction` | Flow direction | Sens des flux | dropdown | enumeration | `auto` | `auto` Automatic; `both` Both ways in one ribbon (each end = what it sends); `arrows` One ribbon per direction, with an arrow; `undirected` Undirected (both ways added up) | Automatic: both ways in one ribbon when every name sends something, otherwise one ribbon per direction with an arrow (a name that only receives would have no arc). |
| `layout.order` | Arc order | Ordre des arcs | dropdown | enumeration | `size` | `size` Largest first; `auto` Fewer crossings (partners side by side) ★; `alpha` Alphabetical; `data` Data order (Sort by column); `custom` Custom (list); `net` Net balance (gainers first) ★ | Order of the arcs, clockwise from the start angle. Net balance: names that receive more than they send come first. |
| `layout.customOrder` | Custom order (separated by ;) | Ordre personnalisé (séparé par ;) | text | text | (empty) | | Visible when `layout.order` = `custom`. Names in this order, the others after them (largest first). |
| `layout.startAngle` | Start angle (degrees, 0 = top) | Angle de départ (degrés, 0 = en haut) | number | integer | `0` | 0 to 359 | |
| `layout.clockwise` | Clockwise | Sens des aiguilles d'une montre | toggle | bool | `true` | true / false | |
| `layout.padAngle` | Space between arcs (degrees) | Espace entre les arcs (degrés) | number | numeric | `2` | 0 to 20 | |
| `layout.arcWidth` | Arc thickness (px) | Épaisseur des arcs (px) | number | integer | `12` | 2 to 60 | |
| `layout.size` | Circle size (%) | Taille du cercle (%) | number | integer | `100` | 40 to 100 | |
| `layout.maxGroups` | Names shown at most (the rest in « Others ») | Noms affichés au plus (le reste dans « Autres ») | number | integer | `20` | 2 to 60 | The names with the most traffic (sent + received) keep their arc; the others are merged into « Others ». |
| `layout.selfLoops` | Flows to itself (A → A) | Flux vers soi-même (A → A) | dropdown | enumeration | `show` | `show` Show (loop on the arc); `hide` Hide | Moves inside the same name (internal transfers, moves within a region). |
### Data colors / Couleurs des données (`dataColors`, Format pane)
Per-item card: Power BI shows it once per series, category, column or KPI (an "Apply settings to" list where relevant). In PBIP `visual.json`, each entry of `objects.dataColors` carries a `selector` (`metadata` = the field's queryRef, or `data` for a category value); an entry without a selector applies to all items.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.mode` | Coloring | Coloration | dropdown | enumeration | `auto` | `auto` Palette (one color per name); `single` Single color | |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color | |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color | |
### Ribbons / Rubans (`flows`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `flows.colorBy` | Ribbon color | Couleur des rubans | dropdown | enumeration | `source` | `source` Origin; `target` Destination; `dominant` The stronger direction ★; `gradient` Gradient origin → destination ★; `neutral` Neutral (gray) | The stronger direction (with one ribbon per direction): both ribbons of a pair take the color of the name that sends the most. |
| `flows.opacity` | Opacity (%) | Opacité (%) | number | integer | `68` | 5 to 100 | |
| `flows.outline` | Ribbon outline | Contour des rubans | toggle | bool | `true` | true / false | |
| `flows.outlineColor` | Outline color (empty = ribbon color) | Couleur du contour (vide = couleur du ruban) | color | fill | (empty) | hex color | Visible when `flows.outline` = `true` |
| `flows.outlineWidth` | Outline width | Épaisseur du contour | number | numeric | `0.6` | 0.2 to 4 | Visible when `flows.outline` = `true` |
| `flows.arrowSize` | Arrow length (px) | Longueur des flèches (px) | number | integer | `10` | 0 to 40 | Used with « One ribbon per direction ». |
| `flows.minShare` | Hide ribbons below (% of total) ★ | Masquer les rubans sous (% du total) ★ | number | numeric | `0` | 0 to 20 | Ribbons smaller than this share of the total are not drawn (the arcs keep their size). |
| `flows.focus` | Highlight ★ | Mettre en avant ★ | text | text | (empty) | | Only the arcs and ribbons of these names keep their color (several names separated by ;). Stays on the page, in PDF exports too. |
| `flows.dimOpacity` | Dimmed ribbons: opacity (% of opacity) | Rubans en retrait : opacité (% de l'opacité) | number | integer | `30` | 5 to 100 | Ribbons set back by a highlight. |
### Indicator ring / Anneau d'indicateurs (`ring`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ring.kind` | Ring around the arcs | Anneau autour des arcs | dropdown | enumeration | `none` | `none` None; `inout` Sent and received (share of each way) ★; `net` Net balance (received − sent) ★; `change` Change since the reference period ★ | Net balance: a bar outside each arc, ▲ when the name receives more than it sends, ▼ otherwise. Change: needs a Play axis field. |
| `ring.reference` | Reference period | Période de référence | dropdown | enumeration | `previous` | `previous` The previous period; `first` The first period | Visible when `ring.kind` = `change` |
| `ring.width` | Thickness (px) | Épaisseur (px) | number | integer | `10` | 3 to 40 | |
| `ring.values` | Write the values (▲ ▼) | Écrire les valeurs (▲ ▼) | toggle | bool | `true` | true / false | |
### Groups (hierarchy) ★ / Groupes (hiérarchie) ★ (`groups`, Format pane)
This card controls premium features (★): they work without a license key but show the watermark while in use.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `groups.show` | Outer group arcs | Arc extérieur des groupes | toggle | bool | `true` | true / false | With a From group / To group field (★): the names of a group stay together, under an outer arc with the group name. |
| `groups.gap` | Space between groups (degrees) | Espace entre les groupes (degrés) | number | numeric | `6` | 0 to 30 | |
| `groups.shades` | Group color, shades for its names | Couleur du groupe, nuances pour ses noms | toggle | bool | `true` | true / false | |
| `groups.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 20 | |
### Category labels / Étiquettes des catégories (`categoryLabels`, Format pane)
The card header toggle is `categoryLabels.show`.
**Labels / Étiquettes**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `categoryLabels.show` | Show | Afficher | toggle | bool | `true` | true / false | |
| `categoryLabels.placement` | Placement | Placement | dropdown | enumeration | `auto` | `auto` Automatic (along the arc, otherwise radial); `curved` Along the arcs; `radial` Radial; `horizontal` Horizontal, with a leader line | Labels never overlap: a label that does not fit is shortened (…) or left out, the largest arcs first. |
| `categoryLabels.content` | Content | Contenu | dropdown | enumeration | `namePct` | `name` Name; `nameValue` Name and value; `namePct` Name and % of total; `all` Name, value and % | |
| `categoryLabels.fontSize` | Text size | Taille du texte | number | formatting | `10` | 6 to 24 | |
| `categoryLabels.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color | |
| `categoryLabels.maxWidth` | Maximum label room (% of the visual) | Place maximale des étiquettes (% du visuel) | number | integer | `25` | 10 to 45 | |
| `categoryLabels.halo` | Text halo | Halo autour du texte | toggle | bool | `true` | true / false | |
| `categoryLabels.bold` | Bold (name) | Gras (nom) | toggle | bool | `true` | true / false | |
| `categoryLabels.italic` | Italic | Italique | toggle | bool | `false` | true / false | |
**Numbers / Nombres**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `categoryLabels.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions | |
| `categoryLabels.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 | |
| `categoryLabels.prefix` | Prefix | Préfixe | text | text | (empty) | | |
| `categoryLabels.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) | | |
### Ticks / Graduations (`ticks`, Format pane)
The card header toggle is `ticks.show`.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ticks.show` | Show | Afficher | toggle | bool | `false` | true / false | |
| `ticks.unit` | Scale in | Graduer en | dropdown | enumeration | `value` | `value` Values; `percent` % of total ★ | |
| `ticks.step` | Step (0 = automatic) | Pas (0 = automatique) | number | numeric | `0` | 0 to … | |
| `ticks.fontSize` | Text size | Taille du texte | number | formatting | `8` | 6 to 16 | |
| `ticks.color` | Color (empty = secondary) | Couleur (vide = secondaire) | color | fill | (empty) | hex color | |
| `ticks.bold` | Bold | Gras | toggle | bool | `false` | true / false | |
| `ticks.italic` | Italic | Italique | toggle | bool | `false` | true / false | |
| `ticks.rotate` | Rotate values along the circle | Valeurs tournées le long du cercle | toggle | bool | `true` | true / false | Off: the tick values stay horizontal. |
### Playback ★ / Lecture ★ (`play`, Format pane)
This card controls premium features (★): they work without a license key but show the watermark while in use.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.start` | Frame shown on opening | Image affichée à l'ouverture | dropdown | enumeration | `last` | `last` The last one (most recent); `first` The first one | |
| `play.speed` | Duration of a frame (ms) | Durée d'une image (ms) | number | integer | `1000` | 100 to 10000 | At speed ×1; the speed button of the play bar multiplies it (×0.5 to ×4) for the session. |
| `play.loop` | Loop | Lecture en boucle | toggle | bool | `false` | true / false | |
| `play.autoPlay` | Play automatically on opening | Lecture automatique à l'ouverture | toggle | bool | `false` | true / false | Once, from the first frame. Not when animations are reduced (Style › Animations or the system) nor on a dashboard tile. |
| `play.transition` | Animated transitions | Transitions animées | toggle | bool | `true` | true / false | Values, positions and colors move smoothly from one frame to the next. |
| `play.controls` | Play bar | Barre de lecture | toggle | bool | `true` | true / false | |
| `play.position` | Bar position | Position de la barre | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top | Visible when `play.controls` = `true` |
| `play.ticks` | Tick marks | Graduations | dropdown | enumeration | `auto` | `auto` Automatic; `all` Every frame; `none` None | Visible when `play.controls` = `true` |
| `play.tickLabels` | Tick labels | Étiquettes des graduations | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.stepButtons` | Start and end buttons | Boutons début et fin | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.speedButton` | Speed button | Bouton de vitesse | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.showLabel` | Current value in large type | Valeur en cours en grand | toggle | bool | `true` | true / false | |
| `play.labelSize` | Large value size | Taille de la valeur en grand | number | formatting | `44` | 12 to 160 | Visible when `play.showLabel` = `true` |
| `play.labelPosition` | Large value position | Position de la valeur en grand | dropdown | enumeration | `bottomRight` | `bottomRight` Bottom right; `topRight` Top right; `topLeft` Top left; `bottomLeft` Bottom left; `center` Center | Visible when `play.showLabel` = `true` |
### Interactions (`interaction`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.hover` | Highlight on hover | Mettre en avant au survol | toggle | bool | `true` | true / false | |
| `interaction.dim` | Dimmed items opacity (%) | Opacité des éléments estompés (%) | number | integer | `25` | 5 to 80 | |
| `interaction.hoverFlows` | Hovering an arc: ribbons shown | Survol d'un arc : rubans montrés | dropdown | enumeration | `both` | `both` Sent and received; `out` Sent only; `in` Received only | |
### Tooltips / Infobulles (`tooltip`, Format pane)
The card header toggle is `tooltip.show`.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `tooltip.show` | Show | Afficher | toggle | bool | `true` | true / false | Tooltip on hover (with the fields of the "Tooltips" well and report page tooltips). |
### Title / Titre (`title`, Format pane)
The card header toggle is `title.show`.
**Title / Titre**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.show` | Show | Afficher | toggle | bool | `true` | true / false | |
| `title.text` | Text | Texte | text | text | (empty) | | Leave empty for an automatic title built from the fields. |
| `title.fontSize` | Size | Taille | number | formatting | `14` | 7 to 40 | |
| `title.bold` | Bold | Gras | toggle | bool | `true` | true / false | |
| `title.italic` | Italic | Italique | toggle | bool | `false` | true / false | |
| `title.underline` | Underline | Souligné | toggle | bool | `false` | true / false | |
| `title.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color | |
| `title.bgColor` | Background color | Couleur d'arrière-plan | color | fill | (empty) | hex color | |
| `title.align` | Horizontal alignment | Alignement horizontal | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right | |
| `title.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `true` | true / false | |
**Subtitle / Sous-titre**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.subtitle` | Subtitle | Sous-titre | text | text | (empty) | | Several lines allowed: type \n to go to the next line. |
| `title.subFontSize` | Size | Taille | number | formatting | `11` | 7 to 30 | Visible when `title.subtitle` = |
| `title.subColor` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color | Visible when `title.subtitle` = |
| `title.subItalic` | Italic | Italique | toggle | bool | `false` | true / false | Visible when `title.subtitle` = |
**Divider / Séparateur**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.divider` | Show divider | Afficher le séparateur | toggle | bool | `false` | true / false | |
| `title.dividerColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `title.divider` = `true` |
| `title.dividerStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `title.divider` = `true` |
| `title.dividerWidth` | Width | Épaisseur | number | integer | `1` | 1 to 6 | Visible when `title.divider` = `true` |
**Spacing / Espacement**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.spaceBelow` | Space below the title (px) | Espace sous le titre (px) | number | integer | `4` | 0 to 40 | |
### Source note / Note de source (`source`, Format pane)
The card header toggle is `source.show`.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `source.show` | Show | Afficher | toggle | bool | `false` | true / false | |
| `source.text` | Text | Texte | text | text | (empty) | | |
| `source.fontSize` | Size | Taille | number | formatting | `9` | 6 to 20 | |
| `source.italic` | Italic | Italique | toggle | bool | `false` | true / false | |
| `source.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color | |
| `source.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right | |
### Frame / Cadre (`container`, Format pane)
**Background / Arrière-plan**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.bgShow` | Background | Arrière-plan | toggle | bool | `false` | true / false | |
| `container.bgColor` | Color | Couleur | color | fill | `#FFFFFF` | hex color | Visible when `container.bgShow` = `true` |
| `container.bgColor2` | Gradient end (optional) | Fin du dégradé (optionnel) | color | fill | (empty) | hex color | Visible when `container.bgShow` = `true` |
| `container.bgTransparency` | Transparency (%) | Transparence (%) | slider | numeric | `0` | 0 to 100 | Visible when `container.bgShow` = `true` |
**Border / Bordure**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.border` | Border | Bordure | toggle | bool | `false` | true / false | |
| `container.borderColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `container.border` = `true` |
| `container.borderWidth` | Width | Épaisseur | number | integer | `1` | 0 to 6 | Visible when `container.border` = `true` |
| `container.radius` | Rounded corners | Coins arrondis | number | integer | `8` | 0 to 24 | |
**Shadow / Ombre**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.shadow` | Shadow | Ombre | toggle | bool | `false` | true / false | |
| `container.shadowColor` | Color (empty = soft) | Couleur (vide = douce) | color | fill | (empty) | hex color | Visible when `container.shadow` = `true` |
| `container.shadowSize` | Blur (px) | Flou (px) | number | integer | `12` | 0 to 40 | Visible when `container.shadow` = `true` |
**Spacing / Marges**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.padding` | Inner padding | Marge intérieure | number | integer | `8` | 0 to 40 | |
### Language and numbers / Langue et nombres (`texts`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `texts.language` | Interface language | Langue de l'interface | dropdown | enumeration | `auto` | `auto` Same as Power BI; `fr` French; `en` English | |
| `texts.numberLocale` | Number format locale (e.g. en-GB) | Format des nombres (ex. fr-FR) | text | text | (empty) | | Thousands and decimal separators. Empty: same as Power BI. |
### Other objects (not in the Format pane cards above)
- `labels`: `labels.show` (bool), `labels.placement` (enumeration), `labels.content` (enumeration), `labels.fontSize` (formatting), `labels.color` (fill), `labels.maxWidth` (integer), `labels.halo` (bool), `labels.units` (enumeration), `labels.decimals` (integer), `labels.prefix` (text), `labels.suffix` (text).