Two activities on one heatmap
Dashy vault/Guides/Two activities on one heatmap
Guides/Two activities on one heatmap.md

Two activities on one heatmap in Obsidian

Properties
blocks
heatmap
keys
layers
needs dataview
checked on
Dashy 1.5.2

Gym in orange, reading in green, on one year of days. One heatmap block, a line per activity. A day with both is painted in one colour, the one you list first, and its tooltip names both.

A year of days: gym days in orange, reading days in green, and a legend with both
What you have at the end of step 2. From a demo vault with a year of daily notes.

1A checkbox per activity

One checkbox property per activity in each daily note. In a daily note, add a property, set its type to Checkbox, and name it after the activity.

Diary/2026-09-14.md
---
gym: true
read: false
---

## 2026-09-14
  • 2026-09-14The note's name is its date. Anything after the date is fine: 2026-09-14 Monday counts too.
  • gym: trueA ticked box paints the day. An unticked one, or none at all, leaves it empty.
  • DiaryThe folder the block reads from. Use the one your daily notes already live in.

Numbers work too: run_km: 8.5 and swim_km: 1.5 on one grid. The darker the cell, the higher the number. The scale is shared by the whole grid, so a layer with small numbers stays pale next to one with big numbers.

2One grid, two colours

Make a note, say Habits.md, and paste this block. It draws the picture above.

Habits.md
```heatmap
source: Diary
layers:
  - { field: gym, color: orange, label: Gym }
  - { field: read, color: green, label: Reading }
title: Gym and reading
```
  • layersOne line per activity, in place of field. Use one or the other, not both.
  • colorPer layer: blue, green, cyan, purple, pink, orange, red, gray or #rrggbb. Leave it out and the next free colour is picked.
  • labelThe name in the legend and the tooltip. Without it, the property name.
  • CaptionCounts the days where any activity was painted.

3Pick which colour wins

A cell has one colour. On a day with both activities, the layer listed first paints it. Hover the cell and the tooltip lists every activity in that day's note, ticked or not, as in Gym 1, Reading 1. A property left out of the note is not listed.

So put first the one you want to see. If reading is rare and you want every reading day to show, swap the lines:

Habits.md
```heatmap
source: Diary
layers:
  - { field: read, color: green, label: Reading }
  - { field: gym, color: orange, label: Gym }
title: Gym and reading
```
No split cells, no mixed colours

A day with both never shows both colours. If every overlap has to be visible at a glance, use two grids, one per activity, as in the variations below.

The whole note

The block from step 2, ready to paste into an empty note.

Habits.md
```heatmap
source: Diary
layers:
  - { field: gym, color: orange, label: Gym }
  - { field: read, color: green, label: Reading }
title: Gym and reading
```

The same with Tracker

Tracker's calendar can read both properties from the same notes:

With the Tracker plugin
```tracker
searchType: frontmatter
searchTarget: gym, read
folder: Diary
datasetName: Gym, Reading
month:
    startWeekOn: 'Mon'
```
  • The calendar is a month view, one month at a time.
  • It shows one activity at a time. Click its name in the header to switch to the next.

With dataviewjs you would draw the grid yourself, or add a heatmap plugin on top of Dataview. That code is longer than this page, so it is left out.

DashyTracker
Both on one gridYes, a colour eachOne at a time, click to switch
A day with bothFirst layer's colour, both in the tooltipShown in each activity's own view
SpanA year, or any rangeA month
What you installDashyTracker

Variations

Every overlap visible

Two grids, one under the other. Same days, same columns.

heatmap
```heatmap
source: Diary
field: gym
color: orange
title: Gym
```

```heatmap
source: Diary
field: read
color: green
title: Reading
```

Three or more

Add a line per activity. A layer without color gets the next free one.

heatmap
```heatmap
source: Diary
layers:
  - { field: gym, color: orange, label: Gym }
  - { field: read, color: green, label: Reading }
  - { field: meditate, label: Meditation }
```

Half a year, phone-sized

One grid over the last 182 days instead of a grid per calendar year.

heatmap
```heatmap
source: Diary
layers:
  - { field: gym, color: orange, label: Gym }
  - { field: read, color: green, label: Reading }
range: 182d
```

Holidays marked

Days whose note sets vacation get a hatched cell, over any colour they have.

heatmap
```heatmap
source: Diary
layers:
  - { field: gym, color: orange, label: Gym }
  - { field: read, color: green, label: Reading }
skip_field: vacation
```

If a block shows an error

A block that cannot draw says why, inside the note. The usual three:

  • layers and field are both set. Keep layers and delete the block's own field line.
  • color is ignored. A color at the top of the block does nothing with layers. Put one on each layer.
  • Layer 2: No note in the selection has "read". The property is misspelled, or the notes are in another folder.