UIXHERO

Heatmap Chart(ヒートマップ)

行と列の交点をセルの濃淡で示すチャート。濃淡で読めるものと読めないもの、色の段階の切り方、行列の並び順、値を数字でも出す判断とアクセシビリティ要件を解説する。

2026年8月27日
更新: 2026年8月27日
23
by Dengen Yosho(DGYS)

行と列の交点にあたるセルを、値の大きさに応じた濃さで塗るチャートです。曜日と時間帯の混み具合、コホートごとの継続率、機能ごとののように、どこに山があるかを先に見つけさせたいときに使います。

この記事を読むと、濃淡で読めるものと読めないものの線引き、色の段階の切り方、行と列の並び順が模様を作る理由、値を数字でも出す判断が自分でできるようになります。


1. UI例(Preview / Live)

実装で見る(GunjoUI)

この部品を、デザインシステム GUNJO の実装で確かめられます。

2. 定義(Definition)

ヒートマップは、行と列で作った格子の各セルを、値の大きさに応じた濃さで塗るチャートです。読者はまず全体の模様を見て、濃い場所(山)と薄い場所(谷)を探します。

濃淡が伝えられるのは順序まで:人は色の濃さから「こちらのほうが濃い」は判断できますが、「こちらは 1.4 倍」は判断できません。ヒートマップは大小の順序を伝える図で、量を正確に伝える図ではありません。

表との違い:同じデータを表で出すと、値は正確に読めますが、山の場所を見つけるには全セルを読む必要があります。ヒートマップは逆で、山はすぐ見つかりますが値は読めません。両方が要るなら、セルに数字を書くか、表を添えます。

棒グラフとの違い:棒グラフは 1 次元(項目ごとの値)を扱います。ヒートマップは 2 次元(行と列の交点)を扱えます。この 2 次元性が、曜日と時間帯のような組み合わせを見せられる理由です。


3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • 2 つの軸の組み合わせを見せる:曜日と時間帯、コホートと経過月、機能とプラン
  • 山や谷を探させたい:どこが混むか、どこで落ちるかを先に見つけてほしいとき
  • セルが多い:30 から 300 くらいのセルなら、表より模様のほうが速く読めます
  • 値の大小の順序が分かれば足りる:正確な数字は次の画面で見せる作りにできるとき

3.2 When NOT to use

  • 正確な値を比べたい:濃淡では読めません。表を使うか、セルに数字を書きます
  • セルが 20 以下:模様が生まれません。表か棒グラフのほうが読めます
  • 行や列の並びに意味が無い:模様が偶然のものになり、読者が意味を読み取ってしまいます
  • 系列が 1 次元しかない:棒グラフを使います

3.3 代替UI(Alternatives)


4. 設計判断の核(Decision Principles)

ヒートマップの核は「濃淡が伝えられるのは順序まで」。だから濃淡は山を探させるために使い、正確な値は数字で別に渡す。

判断の優先順位:1. 濃淡で足りるか、2. 色の段階と方向、3. 行と列の並び順、4. 欠損の扱い。

  • 濃淡で足りるか、値が要るかを決める:「どこが混むか」を探させたいなら濃淡で足ります。「木曜の 12 時は何人か」に答えさせたいなら、セルに数字を書くか、ツールチップと表を添えます。上ので値を出すと、濃淡が探すための地図で、数字が答えであることが見えます。両方を出すのが最も親切ですが、セルが小さいと数字が入りません。そのときはツールチップと表に任せます。
  • 色は連続ではなく段に切る:連続したグラデーションは、凡例と見比べても「だいたいこのあたり」までしか決まりません。5 段から 7 段に切ると、凡例の段と見比べて「この範囲だ」と決められます。段の境目は切りのよい数字にします。GUNJO(群青)は XHERO が作っているデザインシステムです。その HeatmapChartmax で正規化の基準を指定できるので、複数のヒートマップを並べるときは同じ max を渡してスケールをそろえます。
  • 色の方向は、データの性質で決める:「多いほど良い」でも「少ないほど良い」でもない中立のデータ(来店数など)なら、1 色の濃淡(単極)で足ります。プラスとマイナスの両方に意味があるデータ(前期比、目標との差)なら、中央を薄い色にして両方向へ伸ばす配色(双極)にします。単極のデータに双極の配色を使うと、中間の値が「ちょうど良い」に見えます。
  • 行と列の並び順が、模様そのものを作る:曜日の順に並べると「平日の昼」と「週末の夜」という 2 つの山が模様として出ます。混雑の順に並べ替えると山は左に寄りますが、「週末が空いている」という読み方は消えます。上のデモで並べ替えると確かめられます。並び順は、読者に何を見つけさせたいかで決めます。並べ替えできる操作を付けるなら、既定の並びが何であるかを画面に書きます。
  • 濃淡だけに意味を載せない:ヒートマップは、意味のすべてを色に載せてしまう図の代表です。凡例に段の範囲を数字で書き、セルの値をツールチップで出し、可能なら表を添えます。これはAI が作ったUIの失敗 29 件の 28 番目「状態の違いが、色だけに乗る」と同じ崩れ方で、ヒートマップでは最も起きやすくなります。

5. 状態設計(States)

5.1 必須状態(Required)

  • データあり:セル、行と列の見出し、凡例がそろっている
  • データなし:期間内に記録が無い。空の格子だけを残さない
  • 読み込み中:格子の大きさを確保する

5.2 条件付き状態(Conditional)

  • 欠損セル:値が無いセル。0 として最も薄い色で塗らず、斜線や記号で「値が無い」と示す
  • 全セルが同じ:模様が生まれない。データが取れているのか確認できるようにする
  • ホバー / フォーカス:そのセルの行、列、値を出す
  • 選択中:ドリルダウンの起点として選んだセルを、色以外の枠でも示す
  • エラー:取得に失敗した。前回の模様を残したまま最新のように見せない
状態必須何を伝えるか
データあり必須山と谷の場所、全体の模様
データなし必須期間内に記録が無い理由
読み込み中必須取得中であること
欠損セル条件付きここは 0 ではなく、値が無い
全セルが同じ条件付き実際に均一なのか、取得できていないのか
ホバー / フォーカス条件付きそのセルの行と列と値
選択中条件付きいまドリルダウンの対象になっているセル
エラー条件付き取得に失敗した。数字は信用できない

6. バリエーション設計(Variants)

セルの密度と、添える情報の組み合わせです。

バリアントGUNJO の指定典型的な用途
variant="default"(既定)単独で置く。曜日と時間帯など
コンパクトvariant="compact"カードやサイドパネル。セルの高さを抑える
値表示showValues濃淡では読めない差を数字で補う
列サマリーsummary列ごとのピーク値を上部のバーで並べる
選択セルselectedCell + onCellSelectドリルダウンの起点を示す

禁止パターン:凡例を出さないヒートマップ。濃淡が何を意味するのか、どの範囲がどの濃さなのかが分からなくなります。凡例が無い模様は、装飾と区別がつきません。


7. パターン集(Good / Bad / How to fix)

7.0 よく崩れる設計パターン(3つ)

  • 濃淡から正確な値を読ませる:人は色の濃さから量を読み取れません
  • 連続したグラデーションで凡例を作る:段の境目が無く、どの範囲かを決められません
  • 欠損を最も薄い色で塗る:「値が無い」と「値が 0」が同じ見え方になります

7.1 Bad(典型3つ)

  • 濃淡だけのヒートマップに「木曜の 12 時が最も多い」とだけ書き、値をどこにも出していない
  • 凡例が連続したグラデーションの帯で、目盛りの数字が付いていない
  • データが取れていないセルを最も薄い色で塗り、「その時間帯は 0 人」と読まれている

7.2 Good(対になる3つ)

  • 濃淡で山を探させ、ホバーで値を出し、下に数値の表を折りたたんで添える
  • 凡例を 5 段に切り、それぞれの範囲を「0 から 14」のように数字で書く
  • 欠損セルは斜線で塗り、凡例に「データなし」の項目を置く

7.3 How to fix(手順)

  1. 「読者はこの図で何に答えるか」を 1 行で書く。値が要るなら、数字を渡す経路を用意する
  2. 凡例を 5 段から 7 段に切り、各段の範囲を数字で書く
  3. データが単極か双極かを確かめ、配色をそろえる
  4. 行と列の並び順の理由を書く。並べ替えできるなら、既定の並びを画面に書く
  5. 表として組み、<th scope="col"><th scope="row"> で見出しを結ぶ

8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

チャートは「色だけで系列を区別する」が起きやすいコンポーネントです。ヒートマップは意味のほぼすべてを色に載せる図なので、代替の経路がとくに重要です。次の 3 点を満たします。

9.1 色だけに頼らない

  • セル内の数字:セルの高さが足りるなら、値を直接書く。これが最も確実です
  • 凡例の数字:段ごとの範囲を数字で書く。色見本だけの凡例にしない
  • 欠損の記号:斜線や「-」で「値が無い」ことを示す
  • 明度差:段どうしの差を明度で作る。色相だけを変えると、色を区別しにくい読者には同じ濃さに見えます

セルの背景と、その上に載る数字の比は 4.5:1 以上を確保します。濃い段では文字を白に切り替えます。

9.2 代替テキストか表での提示

ヒートマップは表として組めます。表として組むと、読み上げが行と列の見出しをそのまま読んでくれます。

<table>
  <caption>曜日と時間帯ごとの来店数(単位は人・2026年8月)</caption>
  <thead>
    <tr>
      <td></td>
      <th scope="col">月</th><th scope="col">火</th><th scope="col">水</th>
      <th scope="col">木</th><th scope="col">金</th><th scope="col">土</th><th scope="col">日</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">12:00</th>
      <td style="background:var(--heat-4)">62</td>
      <td style="background:var(--heat-5)">66</td>
      <td style="background:var(--heat-4)">64</td>
      <td style="background:var(--heat-5)">71</td>
      <td style="background:var(--heat-4)">58</td>
      <td style="background:var(--heat-3)">34</td>
      <td style="background:var(--heat-2)">26</td>
    </tr>
  </tbody>
</table>

読み上げは「12:00、木、71」と読みます。色は視覚的な補助になり、値そのものはセルの内容として届きます。<svg> で描く場合は、role="img"aria-label に要約(最大のセル、最小のセル、山の場所)を書き、同じ数字を読める表を近くに置きます。

セル数が多いときは、aria-label にすべてを並べません。「最も多いのは木曜12時の71人。平日の昼と週末の夜に山がある」のような要約を書きます。

9.3 キーボードでセルをたどれる

セルがクリックできる(その時間帯の詳細を開くなど)なら、キーボードでも同じことができる状態にします。

  • Tab で格子に入り、ArrowLeft / ArrowRight / ArrowUp / ArrowDown でセルを移動する
  • フォーカス中のセルには、色以外にも見える枠を出す
  • EnterSpace で、クリックと同じ操作が起きる
  • HomeEnd で行の端へ、PageUpPageDown で列の端へ移動できると、大きな格子でも移動が短くなります
  • 移動のたびに「木曜、12時、71人」のように読み上げへ流す

格子全体を 1 つのタブ位置にして、中は矢印キーで動く作りにします。セルの数だけタブ位置があると、次の要素へ移るまでに何十回も Tab を押すことになります。

9.4 Touch / Pointer

セルは小さくなりがちです。タップできる作りにするなら、セルの高さを 44 ピクセル以上にするか、行または列を選ぶ操作に置き換えます。狭い画面では、格子を横スクロールさせるより、行ごとのリストに組み替えるほうが操作しやすくなります。


10. 実装メモ(Implementation Notes)

  • GUNJO の HeatmapChartdata{ x, y, value } の配列)と xLabels / yLabels を受け取ります。dataxy は、ラベルの文字列と一致させます
  • max を明示しないと、そのデータの最大値で正規化されます。複数のヒートマップを並べて比べるなら、同じ max を渡します
  • summary は列ごとのピーク値を上部のバーとして出します。列どうしの比較を、濃淡ではなく長さで扱えるようになります
  • selectedCellonCellSelect でセルの選択を扱えます。選択の表示はリングなので、色以外の手がかりとして機能します
  • 実装は GUNJO の HeatmapChartgunjo.jp を新しいタブで開く にあります。標準、列サマリーつき、値表示、選択セル、コンパクトの見本が置かれています

11. 関連リンク


12. まとめ

ヒートマップの設計でいちばん効くのは、濃淡に何を期待するかを決めることです。迷ったら 4. 設計判断の核 に戻り、「濃淡で足りるか、値が要るか」「凡例は段に切ってあるか」「行と列の並び順に理由があるか」の 3 点を確かめてください。

濃淡は山を探すための地図で、答えそのものではありません。表として組み、セルに値を書き、凡例に段の範囲を数字で置けば、色を区別しにくい読者にも、読み上げを使う読者にも、同じ結論が届きます。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年8月27日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る