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

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

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の回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

4. Plotly.js (react-plotly.js)

typeに'heatmap'を指定するだけで簡単に実装。colorscaleで豊富なカラーパレットが選択可能。

✓ ネイティブ対応✓ カラースケール豊富✓ ズーム・パン標準

チャートを読み込み中...

特徴: colorscale で Blues, Viridis, RdBu など豊富なカラーパレットを選択可能。 SSRには非対応のためdynamic importが必要。
tsx
'use client';
import dynamic from 'next/dynamic';
const Plot = dynamic(() => import('react-plotly.js'), { ssr: false });

export function PlotlyHeatmap() {
  return (
    <Plot
      data={[{
        type: 'heatmap',
        x: ['月', '火', '水', '木', '金'],
        y: ['午前', '午後', '夜間'],
        z: [
          [10, 20, 30, 25, 15],
          [30, 40, 50, 45, 35],
          [20, 15, 25, 20, 10],
        ],
        colorscale: 'Blues',
      }]}
      layout={{ title: { text: '時間帯別アクセス数' }, height: 300, margin: { t: 40, b: 40, l: 60, r: 20 } }}
      style={{ width: '100%' }}
      config={{ responsive: true }}
    />
  );
}

5. Apache ECharts (echarts-for-react)

visualMapコンポーネントでカラースケールと凡例を統合管理。セル内にラベルも表示可能。

✓ ネイティブ対応✓ visualMap連携✓ JSONベース設定

チャートを読み込み中...

特徴: visualMap でカラースケールと凡例を一括管理。 SSRには非対応のためdynamic importが必要。
tsx
'use client';
import dynamic from 'next/dynamic';
const ReactECharts = dynamic(() => import('echarts-for-react'), { ssr: false });

export function EChartsHeatmap() {
  const option = {
    tooltip: { position: 'top' },
    xAxis: { type: 'category', data: ['月', '火', '水', '木', '金'] },
    yAxis: { type: 'category', data: ['午前', '午後', '夜間'] },
    visualMap: { min: 0, max: 50, calculable: true, orient: 'horizontal', left: 'center', bottom: 0 },
    series: [{
      type: 'heatmap',
      data: [
        [0,0,10],[1,0,20],[2,0,30],[3,0,25],[4,0,15],
        [0,1,30],[1,1,40],[2,1,50],[3,1,45],[4,1,35],
        [0,2,20],[1,2,15],[2,2,25],[3,2,20],[4,2,10],
      ],
      label: { show: true },
    }],
  };
  return <ReactECharts option={option} style={{ height: 300 }} />;
}

6. ApexCharts (react-apexcharts)

type="heatmap"を指定するだけで自動カラースケールが適用。seriesの各nameが曜日ラベルとして表示される。

✓ 自動カラースケール✓ シンプルなデータ形式✓ インタラクティブ

チャートを読み込み中...

特徴: seriesの各要素のnameが行ラベルになり、配列データが列値に対応。colorsを1色指定するだけでグラデーションが自動生成される。
tsx
'use client';
import dynamic from 'next/dynamic';
const Chart = dynamic(() => import('react-apexcharts'), { ssr: false });

export function ApexHeatmap() {
  const options = {
    chart: { type: 'heatmap' as const, toolbar: { show: false } },
    dataLabels: { enabled: false },
    colors: ['#3b82f6'],
    xaxis: { categories: ['9時', '12時', '15時', '18時', '21時'] },
    tooltip: { y: { formatter: (val: number) => `${val} アクセス` } },
  };
  const series = [
    { name: '月', data: [45, 80, 62, 35, 20] },
    { name: '火', data: [38, 75, 58, 42, 25] },
    { name: '水', data: [52, 90, 70, 48, 30] },
    { name: '木', data: [41, 68, 55, 38, 18] },
    { name: '金', data: [60, 95, 78, 55, 40] },
  ];
  return <Chart type="heatmap" options={options} series={series} height={300} width="100%" />;
}

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

React + Tailwind CSSで、ApexCharts(react-apexcharts)を使ったヒートマップを実装してください。

- 使用ライブラリ: react-apexcharts の Chart コンポーネント(dynamic importでSSR無効化)
- サンプルデータ: 曜日(月〜金)×時間帯(9時・12時・15時・18時・21時)のアクセス数を用意すること
- データ形式: { name: '月', data: [45, 80, 62, 35, 20] } 形式の series 配列を渡すこと
- グラフ設定: type="heatmap"、chart.type: "heatmap"、toolbar非表示
- カラースケール: colors: ['#3b82f6'] で青系グラデーションを適用すること
- ツールチップ: tooltip.y.formatterで「XX アクセス」形式で表示すること
- X軸ラベル: xaxis.categoriesに時間帯ラベルを設定すること

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

ライブラリ比較

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

選択のポイント

  • カスタム React 実装: 外部ライブラリへの依存を避けたい場合や、完全にカスタムなデザインが必要な場合。 バンドルサイズを最小限に抑えたいプロジェクトにも最適。
  • Nivo: ヒートマップをネイティブサポートしており、最も簡単に美しいヒートマップを実装可能。 ダッシュボードやデータ分析ツールに最適。
  • Chart.js + chartjs-chart-matrix: 既にChart.jsを使用しているプロジェクトに。Canvas APIを活用するため、 セル数が多い大規模なヒートマップでもパフォーマンスが安定。
  • Plotly.js: ズーム・パン・ホバーなどのインタラクティブ機能が標準装備。colorscale で豊富なカラーパレットが選択でき、科学系データの可視化に最適。
  • Apache ECharts: visualMap でカラースケールと凡例を統合管理でき、カスタマイズ性が非常に高い。ダッシュボード構築に適している。
  • ApexCharts: series の配列構造がシンプルで導入コストが低い。colors を1色指定するだけでグラデーションが自動生成され、手軽にヒートマップを追加したい場合に最適。

ヒートマップは、2次元の行列データを色の濃淡で表現するグラフ。値の高低をセルの色で直感的に把握できる。

Webサイトのクリック集計・時間帯別アクセス数・相関係数行列など、2次元データの密度やパターンを可視化する場面で使われる。

主なバリエーション
  • 基本グリッド型
  • カラースケールカスタム型
  • ラベル付きセル型
  • インタラクティブ型(クリック/ホバー)
  • レスポンシブ型

📊 使用しているサンプルデータ(クリックで表示)

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

関連する逆引きリファレンス