Heatmap Chart
Encode magnitude as colour intensity across a matrix of categories or time buckets.
Source
LLM docs
Package
npm install @plocks/chartsExamples
7
Properties
59
Playground
Basics
Loading demo…
import { HeatmapChart } from '@plocks/charts';
import { DAYS, SESSIONS, UTILIZATION } from './data';
export function Demo() {
return (
<HeatmapChart
title="Support ticket load"
subtitle="Average tickets per hour"
h={320}
data={{ rows: SESSIONS, cols: DAYS, values: UTILIZATION }}
cellSize={{ width: 48, height: 44 }}
gap={4}
colorScale={{
domain: [0, 30],
colors: ['#EBF4FF', '#60A5FA', '#1D4ED8'],
}}
xAxis={{
show: true,
title: 'Weekday',
}}
yAxis={{
show: true,
title: 'Shift',
}}
grid={{ show: false }}
legend={{
show: true,
position: 'bottom',
items: [
{ label: 'Low', color: '#EBF4FF' },
{ label: 'High', color: '#1D4ED8' },
],
}}
tooltip={{ show: true }}
/>
);
}GitHub Contributions
GitHub-style contribution calendar generated with a 7x53 grid (weeks x weekdays) and a 5-step color scale.
Loading demo…
import { HeatmapChart } from '@plocks/charts';
import { COLUMNS, CONTRIBUTION_MATRIX, PALETTE, WEEKDAY_LABELS } from './data';
export function Demo() {
return (
<HeatmapChart
title="Weekly contributions"
subtitle="GitHub-style activity calendar"
h={280}
data={{ rows: WEEKDAY_LABELS, cols: COLUMNS, values: CONTRIBUTION_MATRIX }}
cellSize={{ width: 12, height: 12 }}
gap={2}
colorScale={{ domain: [0, 4], colors: PALETTE }}
xAxis={{ show: false }}
yAxis={{
show: true,
labelFormatter: (value) => WEEKDAY_LABELS[value] ?? '',
}}
legend={{
show: true,
position: 'bottom',
items: [
{ label: 'Less', color: PALETTE[0] },
{ label: 'More', color: PALETTE[PALETTE.length - 1] },
],
}}
tooltip={{ show: true }}
/>
);
}Employee Engagement Scores
Visualizes employee engagement survey scores per team across key dimensions to spotlight strengths and low-score focus areas.
Loading demo…
import { HeatmapChart } from '@plocks/charts';
import { DIMENSIONS, SCORES, TEAMS } from './data';
export function Demo() {
return (
<HeatmapChart
title="Employee engagement survey"
subtitle="Dimension scores (1-5) by team"
h={360}
data={{ rows: TEAMS, cols: DIMENSIONS, values: SCORES }}
cellSize={{ width: 96, height: 48 }}
gap={4}
colorScale={{
domain: [1, 5],
stops: [
{ value: 2.5, color: '#F97316' },
{ value: 3.5, color: '#FACC15' },
{ value: 4.5, color: '#22C55E' },
],
}}
valueFormatter={({ value }) => `${value.toFixed(1)} score`}
showCellLabels
xAxis={{ show: true, title: 'Engagement dimension' }}
yAxis={{ show: true, title: 'Team' }}
legend={{
show: true,
position: 'bottom',
items: [
{ label: 'Needs focus (< 3.0)', color: '#F97316' },
{ label: 'Steady (3-4)', color: '#FACC15' },
{ label: 'High confidence (> 4)', color: '#22C55E' },
],
}}
cellCornerRadius={4}
hoverHighlight={{ rowOpacity: 0.12, columnOpacity: 0.12 }}
tooltip={{ show: true, aggregate: false }}
/>
);
}Infrastructure Cpu Utilization
Heatmap of average CPU utilization across infrastructure clusters and daily time blocks, highlighting hotspots that approach saturation bands.
Loading demo…
import { HeatmapChart } from '@plocks/charts';
import { CLUSTERS, CPU_UTILIZATION, TIME_BLOCKS } from './data';
export function Demo() {
return (
<HeatmapChart
title="Infrastructure CPU utilization"
subtitle="Average utilization (%) across compute clusters"
h={360}
data={{ rows: CLUSTERS, cols: TIME_BLOCKS, values: CPU_UTILIZATION }}
cellSize={{ width: 90, height: 44 }}
gap={6}
colorScale={{
domain: [0, 100],
stops: [
{ value: 35, color: '#0EA5E9' },
{ value: 60, color: '#FACC15' },
{ value: 80, color: '#F97316' },
{ value: 95, color: '#DC2626' },
],
}}
valueFormatter={({ value }) => `${Math.round(value)}% utilized`}
showCellLabels={({ width, height }) => width >= 70 && height >= 38}
xAxis={{ show: true, title: 'Time block' }}
yAxis={{ show: true, title: 'Cluster' }}
grid={{ show: true, style: 'dashed' }}
legend={{
show: true,
position: 'bottom',
items: [
{ label: 'Healthy (< 60%)', color: '#0EA5E9' },
{ label: 'Watch (60-80%)', color: '#FACC15' },
{ label: 'Hotspot (> 80%)', color: '#F97316' },
],
}}
cellCornerRadius={6}
hoverHighlight={{ rowOpacity: 0.16, columnOpacity: 0.12 }}
tooltip={{ show: true, aggregate: false }}
/>
);
}Marketing Email Performance
Tracks marketing email click-through rates by segment and day of week to quickly surface best-performing send windows.
Loading demo…
import { HeatmapChart } from '@plocks/charts';
import { CLICK_RATES, DAYS, SEGMENTS } from './data';
export function Demo() {
return (
<HeatmapChart
title="Email click-through performance"
subtitle="Daily CTR (%) across audience segments"
h={320}
data={{ rows: SEGMENTS, cols: DAYS, values: CLICK_RATES }}
cellSize={{ width: 80, height: 44 }}
gap={4}
colorScale={{
domain: [10, 45],
colors: ['#F5F3FF', '#C4B5FD', '#7C3AED'],
}}
valueFormatter={({ value }) => `${Math.round(value)}% CTR`}
showCellLabels={({ cell }) => cell.value >= 32}
xAxis={{ show: true, title: 'Day of week' }}
yAxis={{ show: true, title: 'Segment' }}
legend={{
show: true,
position: 'bottom',
items: [
{ label: 'Baseline', color: '#F5F3FF' },
{ label: 'Above average', color: '#C4B5FD' },
{ label: 'Top performing', color: '#7C3AED' },
],
}}
cellCornerRadius={6}
hoverHighlight={{ rowOpacity: 0.12, columnOpacity: 0.1 }}
tooltip={{ show: true, aggregate: false }}
/>
);
}Quality Assurance Pass Rates
Shows quality assurance pass rates for each regression suite across release candidates, emphasizing areas that fall below the team’s quality threshold.
Loading demo…
import { HeatmapChart } from '@plocks/charts';
import { PASS_RATES, RELEASES, SUITES } from './data';
export function Demo() {
return (
<HeatmapChart
title="QA pass rates by release"
subtitle="Regression suites vs. release candidates"
h={340}
data={{ rows: SUITES, cols: RELEASES, values: PASS_RATES }}
cellSize={{ width: 110, height: 48 }}
gap={4}
colorScale={{
domain: [80, 100],
stops: [
{ value: 85, color: '#F87171' },
{ value: 92, color: '#FBBF24' },
{ value: 98, color: '#34D399' },
],
}}
valueFormatter={({ value }) => `${Math.round(value)}% pass`}
showCellLabels
xAxis={{ show: true, title: 'Release candidate' }}
yAxis={{ show: true, title: 'Test suite' }}
legend={{
show: true,
position: 'bottom',
items: [
{ label: 'Below target (< 92%)', color: '#F87171' },
{ label: 'At risk (92-97%)', color: '#FBBF24' },
{ label: 'Meets target (> 97%)', color: '#34D399' },
],
}}
cellCornerRadius={5}
hoverHighlight={{ rowOpacity: 0.14, columnOpacity: 0.12 }}
tooltip={{ show: true, aggregate: false }}
/>
);
}Support Backlog Priority
Maps support ticket backlog volume across product modules and priority levels to expose severity hot spots.
Loading demo…
import { HeatmapChart } from '@plocks/charts';
import { BACKLOG, MODULES, PRIORITIES } from './data';
export function Demo() {
return (
<HeatmapChart
title="Support backlog by module"
subtitle="Open tickets by severity priority"
h={360}
data={{ rows: MODULES, cols: PRIORITIES, values: BACKLOG }}
cellSize={{ width: 108, height: 48 }}
gap={6}
colorScale={{
type: 'sequential',
interpolation: 'log',
domain: [1, 32],
colors: ['#EFF6FF', '#60A5FA', '#1D4ED8'],
}}
valueFormatter={({ value }) => `${value} ${value === 1 ? 'ticket' : 'tickets'}`}
showCellLabels={({ cell }) => cell.value >= 8}
xAxis={{ show: true, title: 'Priority' }}
yAxis={{ show: true, title: 'Product module' }}
legend={{
show: true,
position: 'bottom',
items: [
{ label: 'Low volume', color: '#EFF6FF' },
{ label: 'Rising load', color: '#60A5FA' },
{ label: 'Critical backlog', color: '#1D4ED8' },
],
}}
cellCornerRadius={4}
hoverHighlight={{ rowOpacity: 0.14, columnOpacity: 0.12 }}
tooltip={{ show: true, aggregate: true }}
/>
);
}Related charts
Further reading
React Native design for iOS, Android, and Web.
Quick Links
Resources