Heatmap

2次元の密度を単一色相の濃淡で見せるヒートマップ。曜日×時間帯などの行×列(matrix)と、日別カレンダー(calendar)に対応。

プレビュー

使いどころ

使う場面

  • 時間帯と曜日など、2 つの軸が交わる場所の濃淡から、集中している所を見つける(matrix)
  • 日ごとの活動量を、1 年などの長い期間で見せる(calendar。コミット数、ログイン回数)
  • 値の違いは 1 色の濃淡で表す。levels(既定 5 段階)と max で、濃さの基準をそろえる

使わない場面

  • 正確な数値を読ませること。濃淡の差は数値ほど細かく読めない。Table を使う
  • 5 行以下・5 列以下の小さな比較。BarChart か Table を使う
  • 値の正負や、基準との差を見せること。濃淡は 1 方向(少ないから多い)にしか使えない
  • 意味の違うカテゴリを色で分けること。1 色の濃淡で、値の大きさだけを表す

使い方

<Heatmap
  aria-label="曜日と時間帯別のアクセス数"
  rows={["月", "火", "水"]}
  columns={["9", "10", "11"]}
  values={[
    [12, 30, 48],
    [8, 25, 44],
    [10, 28, 50],
  ]}
/>

<Heatmap
  variant="calendar"
  aria-label="直近 6 か月のアクティビティ"
  data={[{ date: "2026-10-01", value: 5 }]}
  startDate="2026-05-01"
  endDate="2026-10-29"
/>

プロパティ

名前型デフォルト説明
variant"matrix" | "calendar""matrix"行×列か、日別カレンダーか
rowsstring[]なしmatrix: 行ラベル
columnsstring[]なしmatrix: 列ラベル
values(number | null)[][]なしmatrix: values[行][列]。null はデータなし
dataHeatmapDatum[]なしcalendar: 日別の値(date は YYYY-MM-DD。同日は合計)
startDatestringなしcalendar のときの開始日(YYYY-MM-DD)。未指定なら data の最初の日
endDatestringなしcalendar のときの終了日(YYYY-MM-DD)。未指定なら data の最後の日
weekStartsOn0 | 11calendar: 週の開始曜日(0 = 日曜, 1 = 月曜)
colorstring"var(--chart-1)"濃淡のベース色
levelsnumber5濃淡の段階数
maxnumberなし最も濃くなる値(省略時はデータの最大値)
cellSizenumber16セルの一辺(px)
gapnumber3セル間の余白(px)
showLegendbooleantrue「少 … 多」の凡例
formatValue(value: number) => stringなしツールチップの値のフォーマット関数
formatTooltip(cell: HeatmapCell) => stringなしツールチップ全文の差し替え
aria-label必須stringなしアクセシビリティ用ラベル(必須)
startDate / endDatestringなしcalendar: 表示範囲(省略時はデータの範囲)

型と必須かどうかはソースの型定義から自動で生成しています。表にない HTML 標準の属性(className や aria-* など)も、ルート要素にそのまま渡せます。

アクセシビリティ

  • aria-label は必須。「過去 1 年のコミット数」のように書く。ヒートマップは role="img" で、中のセルは読み上げられない
  • 最大値とその場所(「最大値 42(2026-03-12)」)が、aria-describedby で読み上げ用に付く。ほかのセルの値は伝わらない
  • セルの値は、マウスを重ねたときのツールチップでしか見られない。キーボードでは操作できない。重要な数字は、近くの文章や Table でも伝える
  • 「少 ... 多」の凡例は装飾(aria-hidden)。濃淡の意味は、aria-label か周囲の文で説明する

文言

  • formatValue で単位を付ける(「42 件」)。tooltip の文言を変えるときは formatTooltip を使う

関連するコンポーネント