ヒートマップライブラリ比較

複数のアプローチで同じデータを表示し、ヒートマップの実装方法を比較

📊 使用しているサンプルデータ

曜日×時間帯のウェブサイトアクセス数データを使用しています(7曜日 × 9時間帯 = 63データポイント)。

[
  {
    "day": "月曜",
    "hour": "9時",
    "value": 45
  },
  {
    "day": "月曜",
    "hour": "10時",
    "value": 82
  },
  {
    "day": "月曜",
    "hour": "11時",
    "value": 95
  },
  {
    "day": "月曜",
    "hour": "12時",
    "value": 58
  },
  {
    "day": "月曜",
    "hour": "13時",
    "value": 72
  },
  {
    "day": "月曜",
    "hour": "14時",
    "value": 88
  },
  {
    "day": "月曜",
    "hour": "15時",
    "value": 91
  },
  {
    "day": "月曜",
    "hour": "16時",
    "value": 76
  },
  {
    "day": "月曜",
    "hour": "17時",
    "value": 52
  }
]
  // ... 他の曜日も同様のデータ構造

1. カスタム React 実装(SVG)

Rechartsにはヒートマップの標準コンポーネントがないため、React + SVGでカスタム実装。ライブラリに依存しない柔軟なアプローチ。

✓ 依存ゼロ✓ 完全カスタマイズ✓ 軽量
9時10時11時12時13時14時15時16時17時月曜458295587288917652火曜487890556885877348水曜528898627592958058木曜508092567086897450金曜427585526580786240土曜203542383028251812日曜152530282220181510
特徴: ライブラリに依存せず完全なコントロールが可能。色のスケール、セルのサイズ、ラベルの配置など全て自由にカスタマイズできます。
tsx
'use client';
const days = ['月', '火', '水', '木', '金', '土', '日'];
const hours = ['9時', '12時', '15時', '18時', '21時'];

const rawData = days.map(day => ({
  day,
  values: hours.map(hour => ({
    hour,
    value: Math.floor(Math.random() * 100),
  })),
}));

function getColor(value: number): string {
  const r = Math.round(59 + (value / 100) * (239 - 59));
  const g = Math.round(130 - (value / 100) * 100);
  const b = Math.round(246 - (value / 100) * 200);
  return `rgb(${r},${g},${b})`;
}

export function CustomSvgHeatmap() {
  const cellW = 60, cellH = 40;
  const marginLeft = 40, marginTop = 30;
  const svgW = marginLeft + hours.length * cellW + 10;
  const svgH = marginTop + days.length * cellH + 10;

  return (
    <svg viewBox={`0 0 ${svgW} ${svgH}`} className="w-full">
      {hours.map((h, j) => (
        <text key={h} x={marginLeft + j * cellW + cellW / 2} y={18}
          textAnchor="middle" fontSize={10} fill="#6b7280">{h}</text>
      ))}
      {rawData.map((row, i) => (
        <g key={row.day}>
          <text x={marginLeft - 4} y={marginTop + i * cellH + cellH / 2}
            textAnchor="end" dominantBaseline="middle" fontSize={10} fill="#6b7280">{row.day}</text>
          {row.values.map((cell, j) => (
            <rect key={cell.hour}
              x={marginLeft + j * cellW + 2} y={marginTop + i * cellH + 2}
              width={cellW - 4} height={cellH - 4} rx={3}
              fill={getColor(cell.value)} />
          ))}
        </g>
      ))}
    </svg>
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、カスタムReact実装(SVG)を使ったヒートマップを実装してください。

- 使用ライブラリ: 外部ライブラリなし(React + SVG のみ)
- サンプルデータ: 曜日×時間帯のウェブサイトアクセス数(7×9=63データポイント)を用意すること
- 実装方法: SVGのrect要素でセルを描画し、値に応じてfillの色を動的に計算するカスタム関数を実装すること
- カラースケール: 値の大小に応じてrgba()でセルの色と不透明度を変化させること
- 軸ラベル: X軸に時間帯、Y軸に曜日のtextラベルをSVG内に配置すること
- インタラクティブ: 各セルにtitle要素またはonMouseEnterでツールチップを実装すること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

2. Nivo (@nivo/heatmap)

D3.jsベースの高品質なヒートマップコンポーネント。ネイティブサポートで美しいデザインとアニメーション。

✓ D3.jsベース✓ ネイティブサポート✓ アニメーション豊富
特徴: @nivo/heatmapはヒートマップをネイティブサポート。カラースキーム、凡例、ツールチップなどが組み込みで利用可能。
tsx
'use client';
import { ResponsiveHeatMap } from '@nivo/heatmap';

const data = [
  { id: '月', data: [{ x: '9時', y: 45 }, { x: '12時', y: 80 }, { x: '15時', y: 62 }, { x: '18時', y: 35 }, { x: '21時', y: 20 }] },
  { id: '火', data: [{ x: '9時', y: 38 }, { x: '12時', y: 75 }, { x: '15時', y: 58 }, { x: '18時', y: 42 }, { x: '21時', y: 25 }] },
  { id: '水', data: [{ x: '9時', y: 52 }, { x: '12時', y: 90 }, { x: '15時', y: 70 }, { x: '18時', y: 48 }, { x: '21時', y: 30 }] },
  { id: '木', data: [{ x: '9時', y: 41 }, { x: '12時', y: 68 }, { x: '15時', y: 55 }, { x: '18時', y: 38 }, { x: '21時', y: 18 }] },
  { id: '金', data: [{ x: '9時', y: 60 }, { x: '12時', y: 95 }, { x: '15時', y: 78 }, { x: '18時', y: 55 }, { x: '21時', y: 40 }] },
];

export function NivoHeatmap() {
  return (
    <div style={{ height: 300 }}>
      <ResponsiveHeatMap
        data={data}
        margin={{ top: 40, right: 40, bottom: 40, left: 60 }}
        colors={{ type: 'sequential', scheme: 'blues', minValue: 10, maxValue: 100 }}
        borderWidth={2}
        borderColor="#ffffff"
      />
    </div>
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、Nivo(@nivo/heatmap)を使ったヒートマップを実装してください。

- 使用ライブラリ: @nivo/heatmap の ResponsiveHeatMap
- サンプルデータ: 曜日×時間帯のウェブサイトアクセス数(7×9=63データポイント)を用意すること
- データ形式: 各曜日をid、各時間帯をx、値をyとしたResponsiveHeatMap用のデータ配列に変換すること
- カラースケール: colorsプロパティでtype: "sequential"・scheme: "blues"などのカラースキームを設定すること
- インタラクティブ: tooltipプロパティでカスタムツールチップコンポーネントを渡し、曜日・時間帯・値を表示すること
- 軸ラベル: axisTop・axisLeftで時間帯・曜日ラベルを表示すること
- レスポンシブ: ResponsiveHeatMapで親要素の幅に応じてチャートサイズが変わるよう対応すること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

3. Chart.js (chartjs-chart-matrix)

Chart.jsのプラグインによるマトリクスチャート実装。Canvas APIを活用した高パフォーマンスなヒートマップ。

✓ Canvas API✓ プラグイン拡張✓ 高パフォーマンス
特徴: Chart.jsのchartjs-chart-matrixプラグインを使用。Canvas APIによるレンダリングで大量セルでも高いパフォーマンスを発揮。
tsx
'use client';
import { Chart } from 'react-chartjs-2';
import { Chart as ChartJS, Tooltip, Legend } from 'chart.js';
import { MatrixController, MatrixElement } from 'chartjs-chart-matrix';

ChartJS.register(Tooltip, Legend, MatrixController, MatrixElement);

const days = ['月', '火', '水', '木', '金'];
const hours = ['9時', '12時', '15時', '18時', '21時'];

const matrixData = days.flatMap((day, y) =>
  hours.map((hour, x) => ({ x: hour, y: day, v: Math.floor(Math.random() * 100) }))
);

const data = {
  datasets: [{
    label: 'アクセス数',
    data: matrixData,
    backgroundColor: (ctx: any) => {
      const v = ctx.dataset.data[ctx.dataIndex]?.v ?? 0;
      return `rgba(59, 130, 246, ${v / 100})`;
    },
    borderWidth: 2,
    borderColor: 'white',
    width: ({ chart }: any) => (chart.chartArea?.width || 200) / hours.length - 2,
    height: ({ chart }: any) => (chart.chartArea?.height || 200) / days.length - 2,
  }],
};

export function ChartJSHeatmap() {
  return (
    <Chart type={"matrix" as any} data={data as any}
      options={{ responsive: true, maintainAspectRatio: false }} />
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、Chart.js(chartjs-chart-matrix)を使ったヒートマップを実装してください。

- 使用ライブラリ: chartjs-chart-matrix の MatrixController・MatrixElement、ChartJS.registerで登録すること
- サンプルデータ: 曜日×時間帯のウェブサイトアクセス数(7×9=63データポイント)を用意すること
- データ形式: {x: 時間帯インデックス, y: 曜日インデックス, v: 値}のフラットな配列をdataに渡すこと
- カラースケール: backgroundColor関数でvの値に応じてrgb色を動的に計算すること
- 軸ラベル: x軸にcategory型で時間帯ラベル、y軸にcategory型で曜日ラベルを設定すること
- インタラクティブ: tooltip.callbacks.labelで曜日・時間帯・値を表示すること
- レスポンシブ: responsive: true、maintainAspectRatio: falseで親要素に合わせたサイズにすること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

ライブラリ比較

アプローチレンダリングネイティブ対応カスタマイズ性おすすめ用途
カスタム React 実装SVG-(自作)非常に高い独自デザインが必要な場合
NivoSVG✓ ネイティブ高いデザイン重視のダッシュボード
Chart.js + MatrixCanvas△ プラグイン中程度大量データ・高パフォーマンス

選択のポイント

  • カスタム React 実装: 外部ライブラリへの依存を避けたい場合や、完全にカスタムなデザインが必要な場合。 バンドルサイズを最小限に抑えたいプロジェクトにも最適。
  • Nivo: ヒートマップをネイティブサポートしており、最も簡単に美しいヒートマップを実装可能。 ダッシュボードやデータ分析ツールに最適。
  • Chart.js + chartjs-chart-matrix: 既にChart.jsを使用しているプロジェクトに。Canvas APIを活用するため、 セル数が多い大規模なヒートマップでもパフォーマンスが安定。