Skip to content
Plume Visuals
← Back
Core range

Scatter Plume

Scatter and bubble charts that move through time: play axis, zoom, lasso, quadrants, trends, density and images.

Tutorials ↓
Get it on Microsoft MarketplaceThe visual's official Microsoft listing · free to install

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

Scatter Plume places one point per product, customer or city from two measures, with a third one for bubble size. A date in the play axis moves the bubbles from one month to the next, with the trail of the selected bubbles, and dates are written the way your model formats them (“April 2025”). Zoom with sliders or Shift + drag, select with a rectangle or a lasso, and stay smooth up to 100,000 points. With premium: four named, tinted and counted quadrants, linear or curved trends with equation and a 95% band, symmetry and ratio, ellipses, automatic clusters, small multiples, highlighted points, density for large clouds as hexagons, squares, circles, a continuous surface or contour lines, and an image inside each bubble (flag, logo, embedded photo).

Use cases

  • Volume × margin by product (portfolio matrix)
  • Customers: purchase frequency × average basket, in automatic clusters
  • Products or countries month after month (play axis)
  • Planned × actual: who goes above the diagonal

FreeIncluded for free

  • Play axis: play, slider, loop, trails of the selected bubbles
  • Zoom (sliders, Shift + rectangle), rectangle or lasso selection, clickable legend
  • Up to 100,000 points, jitter for overlapping points
  • Points and bubbles (size scaling like Power BI, bubbles kept inside the plot), one shape per series
  • Labels without overlap, a “Label” field for one text per point, a “Color” field
  • Readable dates everywhere (play axis, tooltips, legend, axes), in the column's format
  • Linear or logarithmic axes; dynamic formats (fx, any option driven by DAX)
  • Drill-down into a Details hierarchy, round the range, gridlines and plot area, × and + markers, hollow points
  • Minimal and Black & White styles, custom colors

PremiumPremium features

  • Named quadrants, four tints, point count, split by a measure
  • Linear, polynomial, exponential, logarithmic and power trends; equation, R², 95% band
  • Symmetry and ratio, confidence ellipses, automatic clusters (k-means), reference lines
  • Small multiples, highlighted points, marginal distributions, connected points
  • Density as hexagons, squares, circles, a continuous surface or contour lines; density trails and selection density
  • “Image” field: one embedded image (base64) inside each bubble, never a web address
  • y = a·x + b lines (margin rates, yields), slope driven by a measure
  • Gradient by a measure; catalog-wide styles, palettes, JSON theme

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.

  1. Getting startedBeginner9 min readPower BI scatter chart: sort your items into four familiesGet started with Scatter Plume: prepare your data, build a bubble chart, label the useful points, split the cloud into quadrants and animate it over time.
  2. How-to guidesIntermediate11 min readScatter Plume: 18 how-to guides (quadrants, animation, density…)Step by step: sort products into four families, animate the cloud over time, zoom in, put a flag inside each bubble, read thousands of points as density.
  3. Fields and settingsIntermediate31 min readScatter Plume: every field and setting of the scatter chartEvery field and setting of Scatter Plume, Format and Analytics panes: play axis, quadrants, density, images, trends, with possible values and defaults.
  4. BasicsGetting started with Plume visualsInstallation, license, styles and the settings shared by every visual.

Fields to drop into the visual

FieldContent
Details (one point each)Product, customer, city…Required
Legend (series)Optional: one color per valueOptional
X axisHorizontal measureRequired
Y axisVertical measureRequired
SizeOptional: bubble size measureOptional
Play axisDate, month or year: the points moveOptional
Small multiplesOne small cloud per valueOptionalPremium
Label (text)Text next to the point; blank = noneOptional
ImageMeasure: embedded image (data:image/… or base64) inside the bubbleOptionalPremium
ColorOne color per point, or a number for a gradient ★Optional
HighlightNot blank and not 0: the point stands outOptionalPremium
Reference XTarget on the X axis (lines, quadrants ★)OptionalPremium
Reference YTarget on the Y axis (lines, quadrants ★)OptionalPremium
TooltipsExtra measuresOptional
Dynamic formatMeasures renamed card.setting (e.g. title.text): the Format pane driven by DAXOptional

Missing a feature? We adapt our visuals or build custom ones. Request a custom visual

Found a bug in Scatter 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.4.0.0. Paste it into your assistant so it can guide you.

Raw Markdown version (/ai/visuals/scatter-chart.md)
# Scatter Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.4.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 Scatter 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/scatter-chart (French: https://plumevisuals.com/fr/visuels/scatter-chart)
- Summary: Scatter and bubble charts that move through time: play axis, zoom, lasso, quadrants, trends, density and images.
- Power BI visual GUID (`visualType`): `plumeScatterChart7F2D4A91C6E34B0D8A5E13F9B2C6D7A1`
- 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

Scatter Plume is a Power BI custom visual (base range, version 1.4.0.0, installed from the `.pbiviz` file; AppSource submission in progress) that draws scatter and bubble charts: one point per value of Details, positioned by two measures (X, Y), with an optional third measure for the bubble area and a Legend for one color (or shape) per series. It covers the native scatter chart and adds what users ask for on the forums: a **play axis** (play button, slider, loop, trails of the selected bubbles), zoom sliders and Shift + drag zoom, rectangle or **lasso** selection, up to **100,000 points** (native: 10,000), jitter for overlapping points, a text label per point (Label field), a color per point (Color field), reference measures (Reference X / Y fields) and readable dates everywhere (play axis, tooltips, Details, Legend, small multiple titles, date axes). Premium adds named and tinted quadrants with point counts, trend models (linear, polynomial, exponential, logarithmic, power) with equation and a 95% band, symmetry shading and ratio line, confidence ellipses, automatic clusters (k-means), small multiples, highlighted points, **density** (hexagons, squares, circles, a continuous surface or contour lines), density trails and density around the selection, marginal distributions, connected points and an **image inside each point** (embedded base64 only). Points glide to their new position when filters change or the play axis moves.

**New in version 1.4.0.0 (30/10/2026):** Format pane reorganized (new **Gridlines** card); free native-parity additions: cross and plus markers, hollow points, label background, "Round the range", axis min / max from a measure (scale kept under filters), **drill-down** of a hierarchy in Details; premium **y = a·x + b lines ★** (Analytics pane).

## Free vs premium (★)

- Every feature works without a key and nothing is ever blocked. Free features never show a watermark, and the default settings use no premium feature.
- 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 (`style.customColors` and the colors under it) are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium** (watermark without a key). See "Styles and theme JSON" below.
- Using a premium feature without a valid key shows **"Plume Visuals · Premium preview"** (French: « Plume Visuals · Aperçu premium ») in the footer, with an "Unlock →" link to the pricing page. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`; French: « Licence Plume Studio › Clé de licence »), the **first card** of the Format pane.
- Premium features of Scatter Plume (the watermark appears only when they actually apply):
  - fields **Small multiples ★** (`multiples`), **Highlight ★** (`highlight`) and **Image ★** (`image`) when filled; a **number** in the Color field (gradient);
  - the **Quadrants ★** card (`quadrants.show`);
  - `dataColors.mode` = `gradient` ("Gradient by a value ★", `dataColors.gradientBy` = `y`, `x`, `size` or `field`);
  - `points.connect` ("Connect the points of each series ★");
  - `play.trails` = `all` ("All points ★"), `play.trailMode` = `density` or `both` ("Density ★", "Lines and density ★");
  - `highlight.names` ("Highlighted points ★");
  - the **Density ★** (`density.show`) and **Marginal distributions ★** (`marginals.show`) cards;
  - `interaction.selDensity` = `series` or `selected` ("Density around the selection");
  - the Analytics pane cards **Reference lines ★** (`reference.show1/2/3`, `reference.band`), **Trend ★** (`trend.show`), **Symmetry and ratio ★** (`symmetry.show`, `symmetry.ratio`), **Confidence ellipses ★** (`ellipses.show`) and **Automatic clusters ★** (`clusters.show`).
- Premium options and list values carry " ★" in their label.
- Accepted keys: only keys starting with `PLUM1.` from the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `scatter-chart` 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". `license.showOwner` displays "Licensed to <holder>".
- Licenses last one year (one-time payment, no automatic renewal, key accepted for 30 more days, reminders 30 and 7 days before the end). Prices per year: 39 € personal, 99 € SME, 299 € enterprise, or a catalog pack (199 € / 399 € / 1,199 € per year; tiers by number of users, designers and viewers included: personal 1–10, SME 11–200, enterprise more than 200). Renewing gives a new key to paste instead of the old one.

## Expected data shape

The visual reads **one row per Details value** (per Details × Legend × Play axis × Small multiples value when those fields are used), with the measures evaluated for that row.

| Details (`details`) | Legend (`legend`) | Play axis (`play`) | X axis (`x`) | Y axis (`y`) | Size (`size`) |
|---|---|---|---|---|---|
| Linen sofa | Furniture | Jan 2025 | 412 | 0.34 | 366 680 |
| Cedar candle | Decor | Jan 2025 | 1 105 | 0.61 | 24 310 |
| … | … | … | … | … | … |

- **Details (one point each)** (`details`, « Détails (un point par valeur) », grouping, one field): one point per value. Without it, one point per series.
- **Legend (series)** (`legend`, « Légende (séries) », grouping, one field, optional): one color per value, and one shape per value with `points.shape` = `series`.
- **X axis** (`x`, « Axe X ») and **Y axis** (`y`, « Axe Y »): one measure each. A row with a blank X or Y is not drawn. A date measure gives a date axis (ticks by granularity).
- **Size** (`size`, « Taille », one measure, optional): bubble **area** proportional to the value, between `points.minSize` and `points.maxSize`, scaled like Power BI (`points.sizeScale` = `auto`, `magnitude`, `range`). Without it, `points.size` is used.
- **Play axis** (`play`, « Axe de lecture », grouping, one field, optional): a date, a month, a year or an ordered category. The points move from one value to the next; axes stay fixed during playback. Dates (including the ISO UTC strings Power BI Desktop sends, such as "2025-03-31T22:00:00.000Z") are read as local dates, sorted as dates and written with the column's format string when it is precise ("mmm yyyy" → "Apr 2025"), otherwise by granularity (first days of months → "April 2025", January 1st → "2025").
- **Small multiples ★** (`multiples`, grouping, one field, optional): one small scatter chart per value (36 at most), same axes for all.
- **Label (text)** (`labelText`, « Étiquette (texte) », one measure, optional): text always written next to each point; blank = no label for that point.
- **Image ★** (`image`, one measure, optional): an embedded image drawn in a disc inside each point. Accepted: `data:image/(png|jpeg|gif|webp|bmp|svg+xml);base64,…` or raw base64 recognized by its signature (PNG, JPEG, GIF, WebP, SVG). An `http(s)` address is **never loaded** (certified visuals make no network request): the point is drawn normally and, in edit mode only, a message explains that only embedded images are shown. Images are not drawn beyond 5,000 points (canvas mode).
- **Color** (`colorBy`, « Couleur », one measure, optional): a color per point (`#RRGGBB`, `#RGB`, CSS names such as `red`), free; a **number** gives a gradient ★ (`dataColors.gradientBy` = `field`).
- **Highlight ★** (`highlight`, one measure, optional): not blank and not 0 = the point stands out (`highlight.color`), the others turn gray (`highlight.othersGray`, `highlight.othersOpacity`).
- **Reference X / Reference Y** (`refX`, `refY`, one measure each, optional): a target or benchmark used by reference lines ★ (`reference.kindN` = `measure`) and quadrant splits ★ (`quadrants.xMode` / `yMode` = `measure`); the line label is the measure name.
- **Tooltips** (`tooltips`) and **Dynamic format** (`format`, see below).
- Volume: windows of 10,000 rows then `fetchMoreData` up to **100,000 points** (a warning beyond that), and 60 Legend values. Above 3,000 points one event listener for the whole cloud; above **5,000 points** the points are drawn on a canvas (hover, click, right-click and rectangle selection kept; no per-point keyboard navigation, no transition, no images).
- Axes, labels and tooltips reuse the format string of each measure (set percentages in the model).

## DAX recipes

```dax
Revenue = SUM ( Sales[Amount] )
Orders = COUNTROWS ( Sales )
Gross margin = SUM ( Sales[Margin] )
Margin rate = DIVIDE ( [Gross margin], [Revenue] )
Average basket = DIVIDE ( [Revenue], [Orders] )

// Label field: text only for the best sellers
Top label = IF ( [Revenue] > 50000, "Top" )

// Color field: a color per point (free)
Margin color = IF ( [Margin rate] > 0.5, "#2E7D4F", "#C0392B" )

// Image field ★: a flag stored as raw base64 in Countries[Flag base64] (Power Query: Binary.ToText ( <file>, BinaryEncoding.Base64 ))
Flag = "data:image/svg+xml;base64," & SELECTEDVALUE ( Countries[Flag base64] )

// Reference Y field: a margin target from a parameter
Margin target = SELECTEDVALUE ( 'Margin threshold'[Margin threshold], 0.45 )
```

Quadrant splits `average` and `median` are computed on the **displayed points** (each point counts once, all series together), not weighted by Size. Use `constant` for a business threshold, in the unit of the measure (0.45 for 45%), or `measure` with the Reference X / Y field.

## Interactions with the report

- Draw a rectangle (`interaction.brush`) or a lasso (`interaction.brushShape` = `lasso`) to select every point inside it (Ctrl to add); click a point, Ctrl + click to add, click the background to clear. Selections cross-filter other visuals. Legend click selects a whole series or cluster (`legend.interactive`), hover highlights it (`interaction.hover`, `interaction.dim`).
- Play axis: selecting a bubble selects that item on every frame (the report is filtered on the item, not on the month); its trail shows its path in chronological order (`play.trails`).
- Zoom: sliders on X and Y (`zoom.x`, `zoom.y`), Shift + drag zooms into a rectangle (`zoom.rect`), double-click or the ⟲ button returns to the full view. The mouse wheel does not zoom (it scrolls the report page).
- Keyboard: Tab to the chart, arrow keys / Home / End to move between points, Enter or Space to select, Esc to clear. Screen-reader announcements, including the current play-axis frame.
- Scatter Plume is cross-filtered by other visuals (it does not render highlighting). Context menu everywhere (points, background, empty plot, axes, legend, play bar), report-page tooltips, landing page, read-only on dashboards, high contrast (one shape per series forced, no tints), reduced motion (no transition, no auto-play). No network request.

## Dynamic formats

- **fx button** on every color and text of the Format pane (*Field value*, *Rules*, *Gradient*), for example `quadrants.colorTR` or `quadrants.lineColor`.
- **Dynamic format** field (role `format`): a measure renamed for this visual as `card.setting` (right-click › Rename for this visual) drives **any** setting: sizes, toggles, lists, fonts, colors, texts. It wins over the fixed value, the style and an fx rule; its measures are never drawn. Names ignore case, accents and separator.
- Value used for a global setting: total when Power BI provides it, else the common value of all points, else the first point; wrap with `CALCULATE ( …, ALLSELECTED () )` for a whole-visual value.
- Examples: `trend.model` = `"poly2"`; `play.speed` = `300`; `density.shape` = `"contour"`; `quadrants.yValue` = a threshold measure (with `quadrants.yMode` = `constant`); `labels.n` = `SELECTEDVALUE ( 'Label count'[Label count], 8 )`. A ★ setting driven by DAX stays ★.

## Format pane: how to read the tables below

- Each option has an ID `card.option` (object name + property name in capabilities.json).
- Card order: `license`, `style`, `dataColors` (dynamic "Data colors": mode, gradient value, then one color per series stored with its selector), `points` (shape, sizes, size scaling, opacity, outline, keep bubbles inside, jitter; Images ★: `imageMinSize`, `imageBorder`, `imageBorderWidth`; Connect points ★), `labels`, `quadrants` (★), `xAxis`, `yAxis`, `legend`, `play` (play axis: start frame, speed, loop, auto-play, play bar, background value, trails, trail style), `zoom`, `smallMultiples` (★), `highlight` (★), `density` (★: `shape` = `hex` / `square` / `circle` / `continuous` / `contour`, `mode` = `under` / `replace`, `radius` for cells, `bandwidth` for continuous and contour (0 = automatic, Scott's rule), `levels` for contour lines, `colorMode`, `opacity`), `marginals` (★), `interaction` (hover, rectangle or lasso, density around the selection), then `title`, `source`, `container`, `texts`. `reference`, `trend`, `symmetry`, `ellipses` and `clusters` are in the **Analytics** pane. Format pane in version 1.4.0.0 (30/10/2026), top to bottom: `license`, `style`, `dataColors`, `points`, `labels`, `quadrants`, `xAxis`, `yAxis`, `gridlines`, `legend`, `play`, `zoom`, `smallMultiples`, `highlight`, `density`, `marginals`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`; Analytics pane: `reference`, `trend`, `symmetry`, `slopes`, `ellipses`, `clusters`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- "Visible when": `quadrants.xValue` only when `quadrants.xMode` = `constant`, `labels.n` only when `labels.which` = `top`, `xAxis.zero` only on a linear scale, `density.radius` only for hexagons, squares and circles, `density.bandwidth` only for continuous and contour, `density.levels` only for contour, `interaction.brushShape` only when `interaction.brush` is on. `interaction.selDensity` is hidden when the Play axis field is filled (use `play.trailMode` instead). Labels follow the Power BI Desktop language; `texts.language` can force French or English.

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID, `queryState` keys are data role names, `objects` keys are option IDs. Literals: `true` / `false`, numbers with `D`, strings and enumeration values in single quotes, colors in `solid.color`.

```json
{
  "visualType": "plumeScatterChart7F2D4A91C6E34B0D8A5E13F9B2C6D7A1",
  "query": {
    "queryState": {
      "details": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Product" } }, "queryRef": "Sales.Product", "nativeQueryRef": "Product" } ] },
      "play":    { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Month" } }, "queryRef": "Sales.Month", "nativeQueryRef": "Month" } ] },
      "x":       { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Orders" } }, "queryRef": "Sales.Orders", "nativeQueryRef": "Orders" } ] },
      "y":       { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Margin rate" } }, "queryRef": "Sales.Margin rate", "nativeQueryRef": "Margin rate" } ] },
      "size":    { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Revenue" } }, "queryRef": "Sales.Revenue", "nativeQueryRef": "Revenue" } ] }
    }
  },
  "objects": {
    "quadrants":  [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } },
                                       "yMode": { "expr": { "Literal": { "Value": "'constant'" } } },
                                       "yValue": { "expr": { "Literal": { "Value": "0.45D" } } },
                                       "topRight": { "expr": { "Literal": { "Value": "'Drivers'" } } },
                                       "bottomLeft": { "expr": { "Literal": { "Value": "'To review'" } } } } } ],
    "play":       [ { "properties": { "speed": { "expr": { "Literal": { "Value": "600D" } } },
                                       "loop": { "expr": { "Literal": { "Value": "true" } } } } } ],
    "density":    [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } },
                                       "shape": { "expr": { "Literal": { "Value": "'continuous'" } } } } } ],
    "labels":     [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } },
                                       "n": { "expr": { "Literal": { "Value": "6D" } } } } } ],
    "dataColors": [ { "properties": { "fill": { "solid": { "color": { "expr": { "Literal": { "Value": "'#b8462a'" } } } } } },
                      "selector": { "metadata": "Sales.Margin rate" } } ],
    "license":    [ { "properties": { "key": { "expr": { "Literal": { "Value": "'PLUM1.…'" } } } } } ]
  }
}
```

Without Legend, the single series color is stored on the Y measure (`"selector": { "metadata": "Sales.Margin rate" }`). For readable play-axis labels, give the date column an explicit format string (`mmm yyyy` for months, `yyyy` for years). The custom visual package must also be embedded in the report.

## 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.themeJson` (Format › Style › Theme JSON ★) takes a JSON theme as plain text. Format v2: an object with an optional `extends` (a style ID above) and optional groups `colors`, `palettes`, `typography`, `shape`, `table`, `marks`, `effects`; the v1 flat format (`style`, `palette`, `accent`, `background`…) is still read. Every field is optional. Colors are `#RRGGBB` (`#RGB` and `#RRGGBBAA` accepted, opacity ignored). Unknown fields and values outside the allowed lists are ignored, out-of-range numbers are clamped. Invalid JSON shows "Invalid theme JSON: ignored" in edit mode and the visual keeps its look.
- Full field list with allowed values, examples and troubleshooting: tutorial https://plumevisuals.com/ai/tutorials/en/themes-json.md (French: https://plumevisuals.com/ai/tutorials/fr/themes-json.md). The same JSON can be pasted in every Plume visual of a page.
- Priority (the last one wins): visual defaults → `style.preset` → `style.themeJson` → `style.palette` (if not "Style or theme palette") → `style.followTheme` → custom colors → options set by hand in the other cards → DAX formats (fx button, "Dynamic format" field) → Windows high contrast.

## Common pitfalls

- Only one point: Details is empty.
- Missing points: blank X or Y, or values ≤ 0 on a logarithmic axis.
- Play axis shows "2025-03-31T22:00:00.000Z" or months in the wrong order: that was version 1.3.0.0; update to 1.3.1.0. For "Apr 2025", give the column the format string `mmm yyyy`.
- The trail zigzags: it links the positions of one item in chronological order; the zigzag is the real month-to-month change. Several selected items = one trail each.
- Image field shows nothing: the measure returns a web address (never loaded), or more than 5,000 points are drawn (canvas). Convert images to base64 (Power Query `Binary.ToText`, or a text column) and build a `data:image/…;base64,` string.
- Fixed split has no effect: the value is in the measure's unit (0.45, not 45, for a percentage).
- The tinted quadrant is always the top-right one **on screen**; with `yAxis.invert` or `xAxis.invert` it is no longer the "high/high" one. Rename quadrants accordingly, or use `quadrants.tintAll`.
- Average split looks wrong: it is unweighted, over displayed points only (filters change it).
- Same product drawn several times: it belongs to several Legend values (e.g. Legend = Channel).
- Density around the selection does not appear: the Play axis field is filled (use `play.trailMode`), or nothing is selected.
- Watermark visible: a ★ option or field is used (see the list above) without a valid key.

## Features that do NOT exist (do not suggest them)

Images loaded from a web address (URLs are ignored by design), mouse-wheel zoom, categorical X axis (dot plot: use Bar Plume), drill-down on Details, LOESS or moving-average trend, outlier detection, more or fewer than four quadrants, 3D scatter, data-driven point shape (other than one shape per Legend value), different axes per small multiple, zoom sliders or marginal distributions in small multiples mode, export of the data from the visual, video export of the animation (PDF and subscriptions show the current frame).

## 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 |
|---|---|---|---|---|---|
| `details` | Details (one point each) | Détails (un point par valeur) | column | 4 |  |
| `legend` | Legend (series) | Légende (séries) | column | 1 |  |
| `x` | X axis | Axe X | measure | 1 |  |
| `y` | Y axis | Axe Y | measure | 1 |  |
| `size` | Size | Taille | measure | 1 |  |
| `play` | Play axis | Axe de lecture | column | 1 | A date, a year or an ordered category: the points move from one value to the next (play button) |
| `multiples` | Small multiples ★ | Petits multiples ★ | column | 1 | One small scatter chart per value, sharing the same axes |
| `labelText` | Label (text) | Étiquette (texte) | measure | 1 | Text written next to each point; blank = no label for that point |
| `image` | Image ★ | Image ★ | measure | 1 | An embedded image per point (data:image/…;base64 or raw base64); web addresses are never loaded |
| `colorBy` | Color | Couleur | measure | 1 | A color (#RRGGBB, red…) per point, or a number for a gradient ★ |
| `highlight` | Highlight ★ | Mise en avant ★ | measure | 1 | Not blank and not 0: the point stands out, the others turn gray |
| `refX` | Reference X | Référence X | measure | 1 | Target or benchmark on the X axis: reference lines and quadrant splits ★ |
| `refY` | Reference Y | Référence Y | measure | 1 | Target or benchmark on the Y axis: reference lines and quadrant splits ★ |
| `tooltips` | Tooltips | Infobulles | measure | several |  |
| `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 = `details` + `play` + `multiples` (one row per combination), 10,000 rows per data window (more fetched automatically); measures = `x`, `y`, `size`, `labelText`, `image`, `colorBy`, `highlight`, `refX`, `refY`, `tooltips`, `format`, grouped into series by `legend`.
Capabilities: supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (323)

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

### 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 series); `single` Single color; `gradient` Gradient by a value ★ |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.gradientBy` | Gradient value | Valeur du dégradé | dropdown | enumeration | `y` | `y` Y axis; `x` X axis; `size` Size; `field` “Color” field |  |

### Points (`points`, Format pane)

**Shape / Forme**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `points.shape` | Shape | Forme | dropdown | enumeration | `circle` | `circle` Circle; `square` Square; `diamond` Diamond; `triangle` Triangle; `cross` Cross (x); `plus` Plus (+); `series` One shape per series | One shape per series helps when colors are hard to tell apart. |
| `points.size` | Size (without a Size field) | Taille (sans champ Taille) | number | integer | `8` | 2 to 40 |  |
| `points.minSize` | Smallest bubble | Bulle la plus petite | number | integer | `5` | 2 to 40 |  |
| `points.maxSize` | Largest bubble | Bulle la plus grande | number | integer | `36` | 6 to 120 |  |
| `points.sizeScale` | Size scaling | Échelle des tailles | dropdown | enumeration | `auto` | `auto` Automatic; `magnitude` Magnitude (0 = smallest); `range` Data range (min → max) | Automatic: magnitude when all sizes have the same sign, data range otherwise (like Power BI). |
| `points.opacity` | Opacity (%) | Opacité (%) | number | integer | `80` | 10 to 100 |  |
| `points.fill` | Fill points | Remplir les points | toggle | bool | `true` | true / false | Off: hollow markers (only their outline, in the point color), like “Fill point” in Power BI. |
| `points.outline` | Outline | Contour | toggle | bool | `true` | true / false |  |
| `points.outlineColor` | Outline color (empty = background) | Couleur du contour (vide = fond) | color | fill | (empty) | hex color | Visible when `points.outline` = `true` |
| `points.outlineWidth` | Outline width | Épaisseur du contour | number | numeric | `1` | 0.5 to 6 | Visible when `points.outline` = `true` |
| `points.autoFit` | Keep bubbles inside the plot | Bulles entières dans le cadre | toggle | bool | `true` | true / false | Widens the axes so that bubbles near the edges are not cut (when minimum and maximum are automatic). |
| `points.jitter` | Jitter overlapping points (px) | Dispersion des points superposés (px) | number | integer | `0` | 0 to 20 | Moves each point by a small fixed offset so that identical points can be seen and clicked. 0 = exact positions. |

**Images ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `points.imageMinSize` | Minimum size of a point with an image (px) | Taille minimale d'un point avec image (px) | number | integer | `22` | 8 to 120 | Points that carry an image (“Image” field) are drawn at least this large so the image stays legible. |
| `points.imageBorder` | Border in the series color | Bordure de la couleur de la série | toggle | bool | `true` | true / false |  |
| `points.imageBorderWidth` | Border width | Épaisseur de la bordure | number | numeric | `1.5` | 0.5 to 6 | Visible when `points.imageBorder` = `true` |

**Connect points ★ / Relier les points ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `points.connect` | Connect the points of each series ★ | Relier les points de chaque série ★ | toggle | bool | `false` | true / false | A line joins the points of a series in the order of the Details field (a year, a month…): a trajectory. |
| `points.connectWidth` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `points.connectStyle` | Line style | Style du trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `points.connectArrows` | Arrow on the last point | Flèche sur le dernier point | toggle | bool | `true` | true / false |  |

### Data labels / Étiquettes de données (`labels`, Format pane)

The card header toggle is `labels.show`.

**Labels / Étiquettes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `labels.content` | Content | Contenu | dropdown | enumeration | `category` | `category` Detail (point name); `categoryY` Name and Y value; `xy` X and Y values; `y` Y value |  |
| `labels.which` | Labeled points | Points étiquetés | dropdown | enumeration | `top` | `top` Largest (N); `all` All (no overlap); `selected` Selected | Points with a text in the “Label (text)” field are always labeled with that text. |
| `labels.n` | N | N | number | integer | `10` | 1 to 200 | Visible when `labels.which` = `top` |
| `labels.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `labels.bgShow` | Background | Arrière-plan | toggle | bool | `false` | true / false | A colored box behind each label, like the native “Background” of category labels. |
| `labels.bgColor` | Background color (empty = background) | Couleur de l'arrière-plan (vide = fond) | color | fill | (empty) | hex color | Visible when `labels.bgShow` = `true` |
| `labels.bgTransparency` | Background transparency (%) | Transparence de l'arrière-plan (%) | slider | numeric | `15` | 0 to 100 | Visible when `labels.bgShow` = `true` |
| `labels.fontSize` | Size | Taille | number | formatting | `10` | 6 to 24 |  |
| `labels.color` | Color (empty = automatic) | Couleur (vide = automatique) | color | fill | (empty) | hex color | Automatic: readable color depending on the background (inside bars: white or dark). |
| `labels.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `labels.halo` | Text halo | Halo autour du texte | toggle | bool | `true` | true / false |  |
| `labels.declutter` | Hide overlapping labels | Masquer les étiquettes qui se chevauchent | toggle | bool | `true` | true / false |  |

**Numbers / Nombres**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `labels.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `labels.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `labels.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |

### Quadrants ★ (`quadrants`, Format pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

The card header toggle is `quadrants.show`.

**Splits / Séparations**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `quadrants.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false |  |
| `quadrants.xMode` | Vertical split | Séparation verticale | dropdown | enumeration | `average` | `average` Average of X; `median` Median of X; `constant` Fixed value; `measure` “Reference X” field |  |
| `quadrants.xValue` | X value | Valeur X | number | numeric | `0` |  | Visible when `quadrants.xMode` = `constant` |
| `quadrants.yMode` | Horizontal split | Séparation horizontale | dropdown | enumeration | `average` | `average` Average of Y; `median` Median of Y; `constant` Fixed value; `measure` “Reference Y” field |  |
| `quadrants.yValue` | Y value | Valeur Y | number | numeric | `0` |  | Visible when `quadrants.yMode` = `constant` |
| `quadrants.lineColor` | Split color (empty = secondary) | Couleur des séparations (vide = secondaire) | color | fill | (empty) | hex color |  |
| `quadrants.lineStyle` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `quadrants.tint` | Tint the top-right quadrant | Teinter le quadrant en haut à droite | toggle | bool | `true` | true / false |  |

**Quadrant colors / Couleurs des quadrants**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `quadrants.tintAll` | Tint all four quadrants | Teinter les quatre quadrants | toggle | bool | `false` | true / false |  |
| `quadrants.colorTR` | Top right (empty = accent) | En haut à droite (vide = accent) | color | fill | (empty) | hex color |  |
| `quadrants.colorTL` | Top left (empty = automatic) | En haut à gauche (vide = automatique) | color | fill | (empty) | hex color | Visible when `quadrants.tintAll` = `true` |
| `quadrants.colorBL` | Bottom left (empty = unfavorable) | En bas à gauche (vide = défavorable) | color | fill | (empty) | hex color | Visible when `quadrants.tintAll` = `true` |
| `quadrants.colorBR` | Bottom right (empty = automatic) | En bas à droite (vide = automatique) | color | fill | (empty) | hex color | Visible when `quadrants.tintAll` = `true` |
| `quadrants.tintOpacity` | Tint opacity (%) | Opacité de la teinte (%) | number | integer | `7` | 2 to 40 |  |
| `quadrants.colorPoints` | Color points by quadrant | Colorer les points selon leur quadrant | toggle | bool | `false` | true / false |  |

**Quadrant names / Noms des quadrants**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `quadrants.topLeft` | Top left | En haut à gauche | text | text | (empty) |  |  |
| `quadrants.topRight` | Top right | En haut à droite | text | text | (empty) |  |  |
| `quadrants.bottomLeft` | Bottom left | En bas à gauche | text | text | (empty) |  |  |
| `quadrants.bottomRight` | Bottom right | En bas à droite | text | text | (empty) |  |  |
| `quadrants.namesSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 20 |  |
| `quadrants.counts` | Point count | Nombre de points | dropdown | enumeration | `none` | `none` None; `count` Count; `percent` Percentage; `both` Count and percentage |  |

### X axis / Axe X (`xAxis`, Format pane)

The card header toggle is `xAxis.show`.

**Values / Valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `xAxis.position` | Position | Position | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top |  |
| `xAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `xAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `xAxis.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `xAxis.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `xAxis.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `xAxis.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |
| `xAxis.line` | Axis line | Trait de l'axe | toggle | bool | `false` | true / false |  |

**Range / Échelle**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.scale` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic |  |
| `xAxis.min` | Minimum | Minimum | text | text | (empty) |  |  |
| `xAxis.max` | Maximum | Maximum | text | text | (empty) |  |  |
| `xAxis.zero` | Always include zero | Toujours inclure zéro | toggle | bool | `false` | true / false | Visible when `xAxis.scale` = `linear` |
| `xAxis.ticks` | Number of ticks (approx.) | Nombre de graduations (environ) | number | integer | `5` | 2 to 20 |  |
| `xAxis.invert` | Invert axis | Inverser l'axe | toggle | bool | `false` | true / false |  |
| `xAxis.round` | Round range | Arrondir la plage | toggle | bool | `true` | true / false | Computed bounds rounded to a round tick. Off: the axis stops at the extreme values. |

**Axis title / Titre de l'axe**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.showTitle` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `xAxis.titleText` | Text | Texte | text | text | (empty) |  | Visible when `xAxis.showTitle` = `true` |

### Y axis / Axe Y (`yAxis`, Format pane)

The card header toggle is `yAxis.show`.

**Values / Valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `yAxis.position` | Position | Position | dropdown | enumeration | `left` | `left` Left; `right` Right |  |
| `yAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `yAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `yAxis.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `yAxis.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `yAxis.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `yAxis.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |
| `yAxis.line` | Axis line | Trait de l'axe | toggle | bool | `false` | true / false |  |

**Range / Échelle**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.scale` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic |  |
| `yAxis.min` | Minimum | Minimum | text | text | (empty) |  |  |
| `yAxis.max` | Maximum | Maximum | text | text | (empty) |  |  |
| `yAxis.zero` | Always include zero | Toujours inclure zéro | toggle | bool | `false` | true / false | Visible when `yAxis.scale` = `linear` |
| `yAxis.ticks` | Number of ticks (approx.) | Nombre de graduations (environ) | number | integer | `5` | 2 to 20 |  |
| `yAxis.invert` | Invert axis | Inverser l'axe | toggle | bool | `false` | true / false |  |
| `yAxis.round` | Round range | Arrondir la plage | toggle | bool | `true` | true / false | Computed bounds rounded to a round tick. Off: the axis stops at the extreme values. |

**Axis title / Titre de l'axe**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.showTitle` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `yAxis.titleText` | Text | Texte | text | text | (empty) |  | Visible when `yAxis.showTitle` = `true` |

### Gridlines / Quadrillage (`gridlines`, Format pane)

**Horizontal**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.hShow` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `gridlines.hColor` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color |  |
| `gridlines.hWidth` | Width | Épaisseur | number | numeric | `1` | 0.5 to 6 |  |
| `gridlines.hStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `gridlines.zeroLine` | Zero line | Ligne du zéro | toggle | bool | `true` | true / false |  |

**Vertical**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.vShow` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `gridlines.vColor` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color |  |
| `gridlines.vWidth` | Width | Épaisseur | number | numeric | `1` | 0.5 to 6 |  |
| `gridlines.vStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |

**Plot area / Zone de tracé**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.plotColor` | Background color (empty = none) | Couleur d'arrière-plan (vide = aucune) | color | fill | (empty) | hex color |  |
| `gridlines.plotTransparency` | Transparency (%) | Transparence (%) | slider | numeric | `0` | 0 to 100 |  |

### Legend / Légende (`legend`, Format pane)

The card header toggle is `legend.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `legend.show` | Show | Afficher | toggle | bool | `true` | true / false | Shown when the chart has several series. |
| `legend.position` | Position | Position | dropdown | enumeration | `top` | `top` Top; `bottom` Bottom; `right` Right; `left` Left |  |
| `legend.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Start; `center` Center; `right` End | Visible when `legend.position` = `top` or `bottom` |
| `legend.showTitle` | Legend title | Titre de la légende | toggle | bool | `false` | true / false |  |
| `legend.titleText` | Title text | Texte du titre | text | text | (empty) |  | Visible when `legend.showTitle` = `true` |
| `legend.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `legend.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `legend.interactive` | Click = select the series | Clic = sélectionner la série | toggle | bool | `true` | true / false |  |

### Highlight ★ / Mise en avant ★ (`highlight`, 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 |
|---|---|---|---|---|---|---|---|
| `highlight.names` | Highlighted points ★ | Points mis en avant ★ | textarea | text | (empty) |  | Names of the Details field (case and accents ignored). The “Highlight” field does the same with a measure. |
| `highlight.color` | Color (empty = point color) | Couleur (vide = couleur du point) | color | fill | (empty) | hex color |  |
| `highlight.othersGray` | Other points in gray | Autres points en gris | toggle | bool | `true` | true / false |  |
| `highlight.othersOpacity` | Other points opacity (%) | Opacité des autres points (%) | number | integer | `35` | 5 to 100 |  |
| `highlight.labels` | Label highlighted points | Étiqueter les points mis en avant | toggle | bool | `true` | true / false |  |

### Zoom (`zoom`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `zoom.x` | X axis zoom slider | Curseur de zoom de l'axe X | toggle | bool | `false` | true / false |  |
| `zoom.y` | Y axis zoom slider | Curseur de zoom de l'axe Y | toggle | bool | `false` | true / false |  |
| `zoom.rect` | Shift + drag: zoom into a rectangle | Maj + glisser : zoomer sur un rectangle | toggle | bool | `true` | true / false | Double-click the chart, or the ⟲ button, to zoom out. |

### Density ★ / Densité ★ (`density`, Format pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

The card header toggle is `density.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `density.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false | Shows where the points concentrate: cells colored by the number of points, or a smooth heat map. |
| `density.shape` | Shape | Forme | dropdown | enumeration | `hex` | `hex` Hexagons; `square` Squares; `circle` Circles (size by count); `continuous` Continuous (smooth gradient); `contour` Contour lines |  |
| `density.mode` | Points | Points | dropdown | enumeration | `under` | `under` Density under the points; `replace` Density instead of the points |  |
| `density.radius` | Cell size (px) | Taille des cases (px) | number | integer | `12` | 4 to 40 | Visible when `density.shape` = `hex` or `square` or `circle` |
| `density.bandwidth` | Smoothing (px, 0 = automatic) | Lissage (px, 0 = automatique) | number | integer | `0` | 0 to 120 | Visible when `density.shape` = `continuous` or `contour`. Radius of the smoothing kernel. Automatic: computed from the spread and the number of points. |
| `density.levels` | Number of contour lines | Nombre de lignes de niveau | number | integer | `6` | 2 to 15 | Visible when `density.shape` = `contour` |
| `density.colorMode` | Colors | Couleurs | dropdown | enumeration | `gradient` | `gradient` Style gradient; `single` One color |  |
| `density.color` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color | Visible when `density.colorMode` = `single` |
| `density.opacity` | Opacity (%) | Opacité (%) | number | integer | `75` | 10 to 100 |  |

### Marginal distributions ★ / Distributions en marge ★ (`marginals`, Format pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

The card header toggle is `marginals.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `marginals.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false | Distribution of X above the chart and of Y on its right. |
| `marginals.kind` | Type | Type | dropdown | enumeration | `histogram` | `histogram` Histogram; `box` Box plot |  |
| `marginals.bins` | Number of bins | Nombre de classes | number | integer | `20` | 5 to 60 | Visible when `marginals.kind` = `histogram` |
| `marginals.bySeries` | One per series | Une par série | toggle | bool | `true` | true / false |  |
| `marginals.size` | Height (px) | Hauteur (px) | number | integer | `44` | 20 to 160 |  |

### Small multiples ★ / Petits multiples ★ (`smallMultiples`, 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 |
|---|---|---|---|---|---|---|---|
| `smallMultiples.columns` | Columns (0 = automatic) | Colonnes (0 = automatique) | number | integer | `0` | 0 to 12 |  |
| `smallMultiples.minHeight` | Minimum chart height (px) | Hauteur minimale d'un graphique (px) | number | integer | `120` | 60 to 600 |  |
| `smallMultiples.gap` | Spacing (px) | Espacement (px) | number | integer | `12` | 0 to 60 |  |
| `smallMultiples.titleSize` | Title size | Taille des titres | number | formatting | `10` | 6 to 24 |  |
| `smallMultiples.border` | Frame around each chart | Cadre autour de chaque graphique | toggle | bool | `false` | true / false |  |

### Playback / Lecture (`play`, Format pane)

| 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` | 200 to 5000 |  |
| `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 | Not when the system asks to reduce motion. |
| `play.controls` | Play bar | Barre de lecture | toggle | bool | `true` | true / false |  |
| `play.showLabel` | Current value in the background | Valeur en cours en fond | toggle | bool | `true` | true / false |  |
| `play.labelSize` | Background value size | Taille de la valeur en fond | number | formatting | `44` | 12 to 160 | Visible when `play.showLabel` = `true` |
| `play.trails` | Trails | Traînées | dropdown | enumeration | `selected` | `selected` Selected points; `none` None; `all` All points ★ | The path of a point from the first frame to the current one. |
| `play.trailMode` | Trail style | Forme des traînées | dropdown | enumeration | `lines` | `lines` Lines; `density` Density ★; `both` Lines and density ★ | Density: a heat map of every position of the point over all frames, drawn under the points (one per series when several points are selected). |

### 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.brush` | Select by drawing a rectangle | Sélection en traçant un rectangle | toggle | bool | `true` | true / false | Drag on the chart to select every point inside the rectangle (Ctrl to add). |
| `interaction.brushShape` | Selection shape | Forme de la sélection | dropdown | enumeration | `rectangle` | `rectangle` Rectangle; `lasso` Lasso (freehand) | Visible when `interaction.brush` = `true` |
| `interaction.selDensity` | Density around the selection | Densité autour de la sélection | dropdown | enumeration | `none` | `none` None; `series` Points of the same series ★; `selected` Selected points ★ | When points are selected, a heat map of their series (or of the selected points) is drawn under the cloud. With a play axis, see Playback › Trail style. |

### Reference lines ★ / Lignes de référence ★ (`reference`, Analytics pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

**Line 1 / Ligne 1**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show1` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.axis1` | Axis | Axe | dropdown | enumeration | `y` | `y` Y axis (horizontal); `x` X axis (vertical) |  |
| `reference.kind1` | Value | Valeur | dropdown | enumeration | `average` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile; `measure` “Reference X” or “Reference Y” field |  |
| `reference.value1` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind1` = `constant` |
| `reference.pct1` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind1` = `percentile` |
| `reference.label1` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue1` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color1` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style1` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width1` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos1` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Line 2 / Ligne 2**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show2` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.axis2` | Axis | Axe | dropdown | enumeration | `y` | `y` Y axis (horizontal); `x` X axis (vertical) |  |
| `reference.kind2` | Value | Valeur | dropdown | enumeration | `constant` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile; `measure` “Reference X” or “Reference Y” field |  |
| `reference.value2` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind2` = `constant` |
| `reference.pct2` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind2` = `percentile` |
| `reference.label2` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue2` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color2` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style2` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width2` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos2` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Line 3 / Ligne 3**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show3` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.axis3` | Axis | Axe | dropdown | enumeration | `y` | `y` Y axis (horizontal); `x` X axis (vertical) |  |
| `reference.kind3` | Value | Valeur | dropdown | enumeration | `median` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile; `measure` “Reference X” or “Reference Y” field |  |
| `reference.value3` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind3` = `constant` |
| `reference.pct3` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind3` = `percentile` |
| `reference.label3` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue3` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color3` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style3` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width3` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos3` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Reference band / Bande de référence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.band` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.bandAxis` | Axis | Axe | dropdown | enumeration | `y` | `y` Y axis; `x` X axis |  |
| `reference.bandFrom` | From | De | number | numeric | `0` |  |  |
| `reference.bandTo` | To | À | number | numeric | `0` |  |  |
| `reference.bandLabel` | Label | Libellé | text | text | (empty) |  |  |
| `reference.bandColor` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.bandOpacity` | Opacity (%) | Opacité (%) | number | integer | `12` | 2 to 60 |  |

### Trend ★ / Tendance ★ (`trend`, Analytics pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

The card header toggle is `trend.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `trend.show` | Show | Afficher | toggle | bool | `false` | true / false | Regression line or curve (least squares). |
| `trend.model` | Model | Modèle | dropdown | enumeration | `linear` | `linear` Linear; `poly2` Polynomial (degree 2); `poly3` Polynomial (degree 3); `exp` Exponential; `log` Logarithmic; `power` Power |  |
| `trend.perSeries` | One trend per series | Une tendance par série | toggle | bool | `false` | true / false |  |
| `trend.showR2` | Show R² | Afficher le R² | toggle | bool | `true` | true / false |  |
| `trend.showEquation` | Show the equation | Afficher l'équation | toggle | bool | `false` | true / false |  |
| `trend.band` | 95% band | Bande à 95 % | dropdown | enumeration | `none` | `none` None; `mean` Confidence (the curve); `prediction` Prediction (the points) |  |
| `trend.bandOpacity` | Band opacity (%) | Opacité de la bande (%) | number | integer | `14` | 3 to 60 |  |
| `trend.color` | Color (empty = text or series) | Couleur (vide = texte ou série) | color | fill | (empty) | hex color |  |
| `trend.style` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `trend.width` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |

### Symmetry and ratio ★ / Symétrie et ratio ★ (`symmetry`, Analytics pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

**Symmetry shading / Ombrage de symétrie**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `symmetry.show` | Show | Afficher | toggle | bool | `false` | true / false | Shades the areas where Y is above and below X, around the y = x diagonal. |
| `symmetry.colorAbove` | Color where Y > X (empty = favorable) | Couleur où Y > X (vide = favorable) | color | fill | (empty) | hex color |  |
| `symmetry.colorBelow` | Color where Y < X (empty = unfavorable) | Couleur où Y < X (vide = défavorable) | color | fill | (empty) | hex color |  |
| `symmetry.opacity` | Opacity (%) | Opacité (%) | number | integer | `8` | 2 to 40 |  |
| `symmetry.labelAbove` | Text where Y > X | Texte où Y > X | text | text | (empty) |  |  |
| `symmetry.labelBelow` | Text where Y < X | Texte où Y < X | text | text | (empty) |  |  |
| `symmetry.diagonal` | y = x diagonal | Diagonale y = x | toggle | bool | `true` | true / false |  |

**Ratio line / Ligne de ratio**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `symmetry.ratio` | Show | Afficher | toggle | bool | `false` | true / false | A line from the origin whose slope is the overall ratio Y ÷ X (like Power BI), or a fixed slope. |
| `symmetry.ratioMode` | Slope | Pente | dropdown | enumeration | `total` | `total` Total Y ÷ total X; `constant` Fixed value |  |
| `symmetry.ratioValue` | Fixed slope | Pente fixe | number | numeric | `1` |  | Visible when `symmetry.ratioMode` = `constant` |
| `symmetry.ratioColor` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `symmetry.ratioStyle` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `symmetry.ratioLabel` | Show the slope | Afficher la pente | toggle | bool | `true` | true / false |  |

### Slope lines y = a·x ★ / Droites y = a·x ★ (`slopes`, Analytics pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

**Line 1 / Droite 1**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `slopes.show1` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `slopes.a1` | Slope a (y = a·x + b) | Pente a (y = a·x + b) | number | numeric | `0.03` |  | E.g. 0.05 for a 5% yield: Y = 5% of X. Can be driven by a measure (Dynamic format field: slopes.a1). |
| `slopes.b1` | Intercept b | Ordonnée à l'origine b | number | numeric | `0` |  |  |
| `slopes.label1` | Label | Libellé | text | text | (empty) |  |  |
| `slopes.color1` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `slopes.style1` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `slopes.width1` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `slopes.labelPos1` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Line 2 / Droite 2**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `slopes.show2` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `slopes.a2` | Slope a (y = a·x + b) | Pente a (y = a·x + b) | number | numeric | `0.05` |  | E.g. 0.05 for a 5% yield: Y = 5% of X. Can be driven by a measure (Dynamic format field: slopes.a2). |
| `slopes.b2` | Intercept b | Ordonnée à l'origine b | number | numeric | `0` |  |  |
| `slopes.label2` | Label | Libellé | text | text | (empty) |  |  |
| `slopes.color2` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `slopes.style2` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `slopes.width2` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `slopes.labelPos2` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Line 3 / Droite 3**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `slopes.show3` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `slopes.a3` | Slope a (y = a·x + b) | Pente a (y = a·x + b) | number | numeric | `0.07` |  | E.g. 0.05 for a 5% yield: Y = 5% of X. Can be driven by a measure (Dynamic format field: slopes.a3). |
| `slopes.b3` | Intercept b | Ordonnée à l'origine b | number | numeric | `0` |  |  |
| `slopes.label3` | Label | Libellé | text | text | (empty) |  |  |
| `slopes.color3` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `slopes.style3` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `slopes.width3` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `slopes.labelPos3` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

### Confidence ellipses ★ / Ellipses de confiance ★ (`ellipses`, Analytics pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

The card header toggle is `ellipses.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ellipses.show` | Show | Afficher | toggle | bool | `false` | true / false | The area that holds most of the points of each series (normal distribution). |
| `ellipses.level` | Level | Niveau | dropdown | enumeration | `95` | `68` 68%; `90` 90%; `95` 95%; `99` 99% |  |
| `ellipses.bySeries` | One per series (or per group) | Une par série (ou par groupe) | toggle | bool | `true` | true / false |  |
| `ellipses.fillOpacity` | Fill opacity (%) | Opacité du remplissage (%) | number | integer | `8` | 0 to 50 |  |
| `ellipses.style` | Line style | Style du trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |

### Automatic clusters ★ / Groupes automatiques ★ (`clusters`, Analytics pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

The card header toggle is `clusters.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `clusters.show` | Show | Afficher | toggle | bool | `false` | true / false | Groups points that are close to each other (k-means) and colors each group. |
| `clusters.k` | Number of clusters (0 = automatic) | Nombre de groupes (0 = automatique) | number | integer | `0` | 0 to 10 |  |
| `clusters.normalize` | Put X and Y on the same scale | Mettre X et Y à la même échelle | toggle | bool | `true` | true / false | Recommended when X and Y have different units (orders and euros). |
| `clusters.centers` | Mark the centers | Marquer les centres | toggle | bool | `true` | true / false |  |
| `clusters.prefix` | Cluster name | Nom des groupes | text | text | (empty) |  |  |

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