# Heatmap in Power BI: grid, calendar and hours of the day

> Get started with Heatmap Plume: prepare the data, insert the visual, read the colors, write values in the cells, filter by clicking and switch to the calendar.

- Language: English
- Web page: https://plumevisuals.com/en/tutorials/heatmap-plume-prise-en-main
- Published: 2026-10-21
- Visual: Heatmap Plume, technical reference: https://plumevisuals.com/ai/visuals/heatmap.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).

## In short

**What is a heatmap?** A table whose cells are colored by their value: light for small values, dark for large ones. Instead of reading the numbers one by one, you see the peaks, the lows and the seasons at a glance.

A tiny example. The Drinks department makes $120K in March and $280K in August: the March cell is light, the August cell is dark. Eight departments over twelve months, 96 cells, read in a few seconds.

- **What the visual does.** Heatmap Plume draws three heatmaps: a **grid** (one row per department, one column per month), a **calendar** (one day per cell, over one or several years) and a **day of week × hour** grid computed from a date-time. It writes the values in the cells, colors them with a gradient or classes and sorts. Premium (★): play axis (animation over time), advanced scales (diverging, quantiles, thresholds, square root, logarithmic, per row), percentages and margin totals, similarity clustering, public holidays, annotations, radial heatmap, comparison with a reference and small multiples.
- **When to use it.** Two crossed dimensions (product × month, region × week), an activity day after day (sales, visits, incidents), peak hours.
- **When to prefer something else.** A trend over time for a few series: Line Plume. A ranking: Bar Plume. A table that must stay readable number by number: Matrix Plume.
- **What you will learn.** Prepare a table, insert the visual, read and set the colors, write values in the cells, filter the page by clicking, switch to the calendar.
- **What you need:** Power BI Desktop, the Heatmap Plume visual installed (see [the Plume basics](/en/tutorials/bien-demarrer-visuels-plume)), a table with two category columns and a value. The sample report **PlumeHeatmap-Sample-EN**, in your ["Downloads" space](/en/account/downloads), shows the revenue of 8 departments and a visits calendar (page 1), peak hours, temperatures by year and month and a department ranking (page 2), and the ★ features, including the play axis (page 3).

## The data to provide

**The shape.** One row per cell: the heatmap row (the department), the column (the month) and the value (the revenue). The first two are category columns, the value is a measure.

| Department | Month | Revenue |
|---|---|---|
| Drinks | Jan | 228,000 |
| Drinks | Feb | 205,000 |
| Drinks | Aug | 284,000 |
| Dairy | Jan | 44,000 |
| Dairy | Feb | 48,000 |
| Dairy | Aug | 89,000 |
| Health and beauty | Jan | 264,000 |
| Health and beauty | Feb | 255,000 |
| Health and beauty | Aug | 137,000 |

To try it without your own data, create this table in **Modeling › New table**:

```dax
Sales =
DATATABLE (
    "Department", STRING, "Month number", INTEGER, "Month", STRING, "Revenue", DOUBLE,
    {
        { "Drinks", 1, "Jan", 228000 }, { "Drinks", 2, "Feb", 205000 }, { "Drinks", 8, "Aug", 284000 },
        { "Dairy", 1, "Jan", 44000 }, { "Dairy", 2, "Feb", 48000 }, { "Dairy", 8, "Aug", 89000 },
        { "Health and beauty", 1, "Jan", 264000 }, { "Health and beauty", 2, "Feb", 255000 }, { "Health and beauty", 8, "Aug", 137000 }
    }
)
```

Then the measure (right-click the **Sales** table › **New measure**):

```dax
Total revenue =
SUM ( Sales[Revenue] )  -- adds up the revenue of the rows in the cell
```

**Pitfalls.**
- **Month order.** A text column "Jan, Feb" sorts alphabetically. Select the `Month` column, then **Column tools › Sort by column › Month number**: the visual follows the model order. With a real date column, nothing to do.
- **A measure, not a column.** Drop a measure into **Value (color)**. A numeric column dropped directly is summed by Power BI: often what you want, but an average needs an `AVERAGE` measure.
- **Blank cells.** A combination without data is hatched and listed as "Blank" in the legend: it is never mistaken for a zero.

## Step by step

1. In the **Visualizations** pane, click the **Heatmap Plume** icon. The visual shows "Add fields to get started".
2. Drop `Department` into **Rows**. A column of cells appears, one per department.
3. Drop `Month` into **Columns**. The grid takes shape: one cell per department and month.
4. Drop the `Total revenue` measure into **Value (color)**. The cells get colored, from very light blue to dark blue, and the values are written in them. The title becomes "Total revenue by Department and Month".
5. Read the legend at the top right: the smallest value on the left, the largest on the right. A dark cell = a high value.
6. Hover a cell: the tooltip gives the department, the month and the revenue, and the row and column names turn to the accent color.
7. Click a cell: the other visuals of the page are filtered to that department that month. Click the name **Drinks**: the whole row is selected. Click an empty area to clear everything.
8. Open **Format › Sort** and choose **Sort rows by › Row total**: the strongest department moves to the top.
9. Open **Format › Color scale** and choose **Color distribution › Equal classes**: five distinct colors, easier to compare, and the legend lists the classes.
10. Open **Format › Cells** and choose **Cell shape › Circles**: each cell becomes a dot, and the color reads the same way.

**And the calendar?** Remove `Department` and `Month`, then drop a **date** column (one row per day) into **Date**: the visual draws a calendar, one day per cell, one strip per year. With a date-time (timestamp), it draws a day of week × hour grid.

## Troubleshooting

| What you see | Likely cause | Solution |
|---|---|---|
| "Add fields to get started" | No measure in **Value (color)** and no date | Drop a measure, or a date column into **Date** |
| Months out of order | Text column sorted alphabetically | **Column tools › Sort by column** with the month number, or use a date column |
| Hatched cells | No data for that department that month | It is on purpose: a blank cell is not a zero. **Format › Color scale › Empty cells** to gray or hide them |
| No value written in the cells | At least one value does not fit: labels are "all or nothing" | Enlarge the visual, reduce **Text size**, choose **Display units › Thousands**, or turn off **Hide the labels when they do not all fit** |
| The grid scrolls instead of showing everything | Too many rows for the height: cells do not shrink below **Minimum size before scrolling** | Lower this setting in **Format › Cells**, or keep the first N rows (**Format › Sort**) |
| All cells have almost the same color | One huge value flattens the others | **Format › Color scale › Color distribution › Equal classes**, or a fixed **Maximum**; premium: **Ignore extreme values ★** or **Scale › Square root ★** |
| A calendar instead of a grid | Only a date is in the fields | Add **Rows** and **Columns**, or choose **Format › Layout › Type › Grid: rows × columns** |

## Key takeaways

- One row per cell: Rows, Columns and a measure in **Value (color)**.
- A date alone gives a calendar, a date-time a day × hour grid.
- A blank cell is hatched, never mistaken for a zero.
- Click a cell, a row or a column name: the page is filtered.
- Colors are set in **Color scale**, palettes in the **Style** card.

**Going further:** the [use cases](/en/tutorials/heatmap-plume-cas-pratiques) (calendar, peak hours, diverging scale ★, sorting, comparison ★, play axis ★) and the [fields and settings reference](/en/tutorials/heatmap-plume-champs-et-reglages); the [Plume basics](/en/tutorials/bien-demarrer-visuels-plume); the [visual's page](/en/visuals/heatmap); a question: [support](/support).
