Calendar heatmap

Calendar heatmap screenshot
Date values placed into a week-by-day calendar grid. Use it for contribution, activity, incident, and habit patterns over weeks or months. The screenshot is captured from the native Fission chart gallery.

What the chart is for

Calendar heatmap is part of the Coordinates chart family and is intended for Date/value pairs using YYYY-MM-DD dates. Use it when the visual form makes the user's question faster to answer than a table or a simpler chart would.
Avoid it when readers need exact linear comparison; coordinate charts work best when the coordinate system carries meaning.

Data model

Date/value pairs using YYYY-MM-DD dates. Keep the data close to the type that describes it. Fission Charts is typed Rust, so a line uses LineSeries, a calendar heatmap uses CalendarHeatmapSeries, and chart components such as zoom, marks, and graphics are explicit fields on Chart rather than hidden string configuration.

Rust API

Field
Type
Notes
title
&str
Names the chart for the screen, accessibility tree, and test output.
visual_map
VisualMap
Maps daily value intensity to color.
series
CalendarHeatmapSeries
Stores ISO date/value pairs and an optional visible date range.
width / height
f32
Optional fixed size; omit them when the chart should flex inside Fission layout.

Example

use fission::charts::{CalendarHeatmapSeries, Chart, VisualMap};

let chart = Chart::new()
    .title("Calendar heatmap")
    .visual_map(VisualMap::new().min(0.0).max(18.0))
    .series(vec![CalendarHeatmapSeries::new("Commits")
        .range("2026-01-01", "2026-03-31")
        .data(vec![("2026-01-05", 12.0), ("2026-02-14", 18.0), ("2026-03-16", 15.0)])
        .into()]);

Interaction and animation

Charts can emit typed ChartInteractionEvent values when interaction is enabled. Handle those events in a reducer when the app needs hover, press, release, scroll, selection, or brush behavior. ChartAnimation stores duration, delay, stagger, easing, and reduced-motion behavior as deterministic chart data, so animation timing can be tested instead of being hidden in ad-hoc timers.

Testing guidance

For this chart, test the data mapping first, then test lowering, then capture a live screenshot when visual output changes. The screenshot for this page is refreshed by running the ignored chart-gallery screenshot capture test with FISSION_UPDATE_CHART_DOCS=1, which updates documentation/static/img/charts before the static site build.

Authoring from a Fission component

Use this reference page as the chart expression inside ordinary Fission component conversion. The chart is a Widget, so it can sit inside a Card, Grid, Scroll, responsive page section, or any other layout container.
use fission::prelude::*;
use fission::charts::{CalendarHeatmapSeries, Chart, VisualMap};

pub struct CalendarHeatmapChart;

impl From<CalendarHeatmapChart> for Widget {
    fn from(_: CalendarHeatmapChart) -> Widget {
        Chart::new()
            .title("Calendar heatmap")
            .visual_map(VisualMap::new().min(0.0).max(18.0))
            .series(vec![CalendarHeatmapSeries::new("Commits")
                .range("2026-01-01", "2026-03-31")
                .data(vec![("2026-01-05", 12.0), ("2026-02-14", 18.0), ("2026-03-16", 15.0)])
                .into()])
            .into()
    }
}
Keep expensive data loading outside component conversion. A reducer, job, service, or server route should prepare the typed chart data, then the component should read that state and construct the chart deterministically.

Options, accessibility, and diagnostics

Area
What to decide
How to verify
Data shape
Keep source rows in typed Rust structs, then map them into the series type shown in the example.
Unit test the mapping separately from rendering.
Options
Choose axes, legends, labels, animation, and interaction based on the user's task.
Add a screenshot test when changing visual behavior.
Accessibility
Provide a clear title and adjacent summary text for important trends or outliers.
Inspect the generated semantics and make sure the chart is understandable without color alone.
Failure handling
Render an empty, loading, or error state before constructing the chart if data is unavailable.
Test empty data, partial data, and failed fetches.
Performance
Prefer summarized or windowed data for very large datasets; keep full raw history in the data layer.
Profile frame time and interaction latency with representative data volumes.
Tags: calendar, heatmap.
Coordinates family overview
Fission
A cross-platform, GPU-accelerated user interface framework for Rust. MIT licensed.
Copyright (c) 2026 Fission
Ready to use today. Widget APIs are expected to remain stable; some runtime and shell APIs may change before 1.0.0.
Fission 0.7.0