SCALE — Build Lab
UI部品 · REACT COMPONENT

ヒートマップ(曜日×時間)

CATEGORYUI部品 TYPEReact Component EFFORT120〜240分 DIFFICULTY
PRIMARY CODE
tsx
export function Heatmap({ data }: { data: { day: number; hour: number; value: number }[] }) {
  const max = Math.max(...data.map(d => d.value), 1);
  const get = (d: number, h: number) => data.find(x => x.day === d && x.hour === h)?.value ?? 0;
  const days = ['月','火','水','木','金','土','日'];
  return (
    <table style={{ borderCollapse: 'collapse', fontSize: '.65rem' }}>
      <thead><tr><th></th>{Array.from({length:24}).map((_,h) => <th key={h} style={{padding:'.15rem'}}>{h}</th>)}</tr></thead>
      <tbody>
        {days.map((dn, d) => (
          <tr key={d}>
            <td style={{padding:'.15rem .35rem', color:'#71717a'}}>{dn}</td>
            {Array.from({length:24}).map((_,h) => {
              const v = get(d, h);
              const a = v / max;
              return <td key={h} title={`${dn} ${h}時: ${v}`}
                style={{width:14, height:14, background:`rgba(165,180,252,${a})`, border:'1px solid rgba(255,255,255,.05)'}} />;
            })}
          </tr>
        ))}
      </tbody>
    </table>
  );
}
前提条件
Tailwind CSS v4TypeScript 5
USE CASES
  • アクティビティ可視化
  • 営業電話の最適タイミング
  • サポートピーク分析

ヒートマップ(曜日×時間)

:LiTarget: 用途

曜日×時間帯の活動量を色濃淡で可視化。GitHub の contribution graph 風。

:LiSparkle: 特徴

  • 曜日×時間 の 7×24 グリッド
  • 色濃淡で量表現
  • ツールチップ
  • クリックで詳細

:LiCode: コード(コピペ用)

export function Heatmap({ data }: { data: { day: number; hour: number; value: number }[] }) {
  const max = Math.max(...data.map(d => d.value), 1);
  const get = (d: number, h: number) => data.find(x => x.day === d && x.hour === h)?.value ?? 0;
  const days = ['月','火','水','木','金','土','日'];
  return (
    <table style={{ borderCollapse: 'collapse', fontSize: '.65rem' }}>
      <thead><tr><th></th>{Array.from({length:24}).map((_,h) => <th key={h} style={{padding:'.15rem'}}>{h}</th>)}</tr></thead>
      <tbody>
        {days.map((dn, d) => (
          <tr key={d}>
            <td style={{padding:'.15rem .35rem', color:'#71717a'}}>{dn}</td>
            {Array.from({length:24}).map((_,h) => {
              const v = get(d, h);
              const a = v / max;
              return <td key={h} title={`${dn} ${h}時: ${v}`}
                style={{width:14, height:14, background:`rgba(165,180,252,${a})`, border:'1px solid rgba(255,255,255,.05)'}} />;
            })}
          </tr>
        ))}
      </tbody>
    </table>
  );
}

:LiHandPointer: 使い方

対象プロジェクトに該当ファイルをコピーして、props を流し込むだけ。

:LiAlertCircle: 注意事項

  • 依存パッケージを忘れず追加