ヒートマップライブラリ比較
6つのアプローチで同じデータを表示し、ヒートマップの実装方法を比較
1. カスタム React 実装(SVG)
Rechartsにはヒートマップの標準コンポーネントがないため、React + SVGでカスタム実装。ライブラリに依存しない柔軟なアプローチ。
'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ベースの高品質なヒートマップコンポーネント。ネイティブサポートで美しいデザインとアニメーション。
'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を活用した高パフォーマンスなヒートマップ。
chartjs-chart-matrixプラグインを使用。Canvas APIによるレンダリングで大量セルでも高いパフォーマンスを発揮。'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が必要。'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 でカラースケールと凡例を一括管理。 SSRには非対応のためdynamic importが必要。'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が曜日ラベルとして表示される。
チャートを読み込み中...
nameが行ラベルになり、配列データが列値に対応。colorsを1色指定するだけでグラデーションが自動生成される。'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 | -(自作) | 非常に高い | 独自デザインが必要な場合 |
| Nivo | SVG | ✓ ネイティブ | 高い | デザイン重視のダッシュボード |
| Chart.js + Matrix | Canvas | △ プラグイン | 中程度 | 大量データ・高パフォーマンス |
| Plotly.js | SVG/WebGL | ✓ ネイティブ | 高い | 科学系・統計分析 |
| Apache ECharts | Canvas/SVG | ✓ ネイティブ | 非常に高い | エンタープライズダッシュボード |
| ApexCharts | SVG | ✓ ネイティブ | 高い | シンプルなダッシュボード |
選択のポイント
- •カスタム 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データポイント)。
関連する逆引きリファレンス
- → 色・スタイルのカスタマイズ(borderColor・fillOpacity など)
- → ツールチップのカスタマイズ(カスタムHTML・フォーマッタ)
- → 軸(Axis)の設定(ラベルフォーマット・対数スケール・複数軸)
- → レスポンシブ対応(コンテナ追従・アスペクト比・リサイズ)
- → アニメーション・トランジション(初期描画・データ更新・イージング)
- → 凡例(Legend)の配置・スタイル(位置・アイコン・系列トグル)
- → データラベルの表示(値・位置・フォーマッタ)
- → クリックイベント・インタラクション(クリック・ホバー・ブラシ選択)
- → グリッド線のカスタマイズ(表示制御・線スタイル・リファレンスライン)