# Annotate a line chart: comments attached to points

> Explain a peak or a dip right on the line with Line Plume: “Annotate” button, “x | series | text” list or DAX measure, annotations that follow the filters.

- Language: English
- Web page: https://plumevisuals.com/en/tutorials/courbes-annotations
- Published: 2026-10-04
- Visual: Line Plume, technical reference: https://plumevisuals.com/ai/visuals/line-chart.md
- If an option name in this tutorial differs from the technical reference, the reference is right (it is generated from the visual's code).

A peak in November, a dip in April: on a line chart, readers see the event but not its explanation. In Power BI, you then drop a text box on top of the chart… which lands next to the point as soon as someone filters a year or resizes the visual. **Line Plume** attaches each annotation to a point of the line (an x value and a series): the bubble follows the line when the data changes and disappears when the point is no longer shown. This tutorial annotates the monthly sales of a home store (fictitious data).

## What you need

- A recent version of Power BI Desktop.
- The **Line Plume** visual, installed from the `.pbiviz` file in your ["Downloads"](/en/account/downloads) area: Visualizations pane › **…** › **Import a visual from a file**.
- A date (or month) column and a measure.

The **PlumeLineChart-Sample-EN** sample report, in the same area, shows these charts ("2 · Annotations ★" page).

## 1. Prepare the data

The `Sales` table has one row per order, with a `Month` column (first day of the month, `mmm yyyy` format) and a `Channel` column (*Store*, *Web*, *Phone*). For annotations that come from the data, add a small `Events` table (Home › **Enter data**): a `Month` column (date) and a `Text` column, with no relationship.

```dax
Revenue = SUM ( Sales[Amount] )

Event =
VAR m = MAX ( Sales[Month] )
RETURN
    CONCATENATEX ( FILTER ( Events, Events[Month] = m ), Events[Text], " · " )
```

`Event` returns a text for the months listed in the table and nothing elsewhere: each non-blank value becomes an annotation.

## 2. Drop the fields

| Visual well | Field |
|---|---|
| X axis | `Month` (the field itself, not its date hierarchy) |
| Legend (series) | `Channel` (optional) |
| Y axis values | `Revenue` |
| Annotations (text) | `Event` (optional) |

Dates are spaced by their real gap. On hover, a vertical guide shows every channel for the month in one tooltip. Set **X axis › Date format** (for example `MMM yyyy`) and **Lines › Shape** (*Straight*, *Smooth* or *Step*).

## 3. Three ways to annotate

**With the "Annotate" button** (the fastest). In edit mode, hover the chart: an **Annotate** button appears. Click it, then a point of the line, type the text and press **Enter** (**Esc** cancels). The visual writes the line into the Format pane list by itself. Then:

- **drag** a bubble to move it (the position is saved);
- **double-click** it to edit the text;
- click **×** to delete it.

With the keyboard: Tab to the chart, **Annotate** (Enter), ← → for the date, ↑ ↓ for the line, Enter to type the text.

**With the list.** In **Annotations ★ › Annotations (one per line)**, one line per annotation, as `x | text` or `x | series | text`:

```text
# Lines starting with # are comments
2023-11 | Web | Black Friday: Web record
2023-12 | Store | Christmas in store
2025-03-15 | Mid-March
```

- **x**: a date (`2024-06-01`, `2024-06`, `2024`, `06/15/2024` in US English), a number or a category as displayed. A date missing from the data goes to the nearest point, as long as it stays within the axis range.
- **series**: optional, the name as shown in the legend (case and accents ignored). Without a series: the first line that has a value at x.
- **text**: up to 4 lines, wrapped automatically. A vertical bar inside the text is written `\|`.

**With a measure.** The `Event` measure in **Annotations (text)** creates one annotation per non-blank value. These annotations can be dragged, but are edited in the `Events` table.

> **Tip:** A line that cannot be placed (unknown series, unreadable date) is reported at the bottom of the chart, in edit mode only: "Annotation ignored (series or x not found)". A month that is simply filtered out is not an error: the annotation comes back with its point.

## 4. Tune how annotations look

1. **Annotations ★ › Displayed content**: *Text*, *Text and value* or *Text, x and value*.
2. **Style**: *Bubble*, *Filled label* or *Text only*; **Color (empty = series color)**, **Text size**, **Maximum width (px)**.
3. **Marker on the point**, **Connector** (*Line* or *None*) and its **Line style**.
4. **Default position**: *Automatic (no overlap)* avoids lines, labels and axes; **Distance from the point (px)** moves bubbles further away.
5. To publish a report without the button, turn off **"Annotate" button (edit mode)**: annotations stay visible.

## 5. Premium features ★

| Feature | Where to set it |
|---|---|
| Annotations (button, list, measure) | **Annotations ★** card and **Annotations (text)** well |
| Name and last value at the end of each line | **End-of-line labels ★** |
| One or more series in color, the others in gray | **Data colors › Coloring**: *Highlight series ★* |
| Gradient area | **Lines › Fill under the line**: *Gradient ★* |
| Reference lines, trend | **Analytics** pane › **Reference lines ★**, **Trend ★** |

> **Note:** No feature is ever blocked. Without a key, annotations display normally with a light "Plume Visuals · Premium preview" watermark and an "Unlock →" link. Paste a license key (format `PLUM1.…`, valid for one year) in **Plume Studio License › License key**, the first card of the Format pane, to remove it. Line Plume alone: €39 (Personal), €99 (Small business) or €299 (Enterprise), or the Full catalog bundle: see [pricing](/en/pricing).

## 6. Dynamic formats

Any setting can come from a DAX measure (see [the tutorial](/en/tutorials/formats-dynamiques)). Example: build the whole annotation list, series included, from a `Notes` table (columns `Month`, `Channel`, `Text`):

```dax
Notes list =
CONCATENATEX ( Notes, FORMAT ( Notes[Month], "yyyy-MM" ) & " | " & Notes[Channel] & " | " & Notes[Text], UNICHAR ( 10 ) )
```

Drop the measure into **Dynamic format**, then right-click › **Rename for this visual**: `annotations.list`. It wins over the Format pane list: add annotations in the table, not with the button.

## Common pitfalls

- **The same annotation on every line**: with a **Legend (series)**, the annotation measure is evaluated for each series. Limit it to one series, for example `IF ( SELECTEDVALUE ( Sales[Channel] ) = "Web", [Event] )`.
- **Nothing shows**: **Annotations ★ › Show** is off, or x is outside the axis range (year filter).
- **Dates read the wrong way**: `03/04/2025` follows the day / month order of the number locale; the `2025-04-03` format is always understood.
- **A value starts with #**: write `\#`, otherwise the line is a comment.
- **Only one measure in Y axis values** with a legend: remove the legend to draw several measures or use **Secondary Y axis values**.

Another question? Go to [support](/en/support).

## Summary

- One annotation = one point (x, series): it follows the line and the filters.
- **Annotate** button to go fast, `x | series | text` list to review everything, text measure for events coming from the data.
- Visual page and live demo: [Line Plume](/en/visuals/line-chart).
