ヒートマップライブラリ比較
複数のアプローチで同じデータを表示し、ヒートマップの実装方法を比較
📊 使用しているサンプルデータ
曜日×時間帯のウェブサイトアクセス数データを使用しています(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でカスタム実装。ライブラリに依存しない柔軟なアプローチ。
✓ 依存ゼロ✓ 完全カスタマイズ✓ 軽量
少
多
特徴: ライブラリに依存せず完全なコントロールが可能。色のスケール、セルのサイズ、ラベルの配置など全て自由にカスタマイズできます。
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 | -(自作) | 非常に高い | 独自デザインが必要な場合 |
| Nivo | SVG | ✓ ネイティブ | 高い | デザイン重視のダッシュボード |
| Chart.js + Matrix | Canvas | △ プラグイン | 中程度 | 大量データ・高パフォーマンス |
選択のポイント
- •カスタム React 実装: 外部ライブラリへの依存を避けたい場合や、完全にカスタムなデザインが必要な場合。 バンドルサイズを最小限に抑えたいプロジェクトにも最適。
- •Nivo: ヒートマップをネイティブサポートしており、最も簡単に美しいヒートマップを実装可能。 ダッシュボードやデータ分析ツールに最適。
- •Chart.js + chartjs-chart-matrix: 既にChart.jsを使用しているプロジェクトに。Canvas APIを活用するため、 セル数が多い大規模なヒートマップでもパフォーマンスが安定。