chart.js、d3、recharts は、ウェブ上でグラフやチャートを描画するための代表的なライブラリです。chart.js は Canvas を使用し、設定オブジェクトを通じて簡単に標準的なグラフを作成できます。d3 は SVG や DOM 操作に焦点を当てた低レベルなライブラリで、自由度が非常に高いですが学習コストも高いです。recharts は React 専用に設計されており、宣言的なコンポーネント構成でグラフを構築できます。それぞれアプローチが異なるため、プロジェクトの要件や技術スタックに合わせて選択する必要があります。
chart.js、d3、recharts はすべてデータ可視化を実現しますが、内部の仕組みと開発体験は大きく異なります。chart.js は手軽さを重視し、d3 は自由度を重視し、recharts は React との親和性を重視しています。実際の開発現場でどのように違うのか、主要な観点から比較します。
描画方式の違いは、パフォーマンスとカスタマイズ性に直結します。
chart.js は Canvas API を使用します。
// chart.js: Canvas コンテキストを使用
import { Chart } from 'chart.js';
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'bar',
data: { /*...*/ },
options: { /*...*/ }
});
d3 は主に SVG を使用します(Canvas も可能)。
// d3: SVG 要素を生成
import * as d3 from 'd3';
const svg = d3.select('#chart').append('svg');
svg.selectAll('rect')
.data(data)
.enter().append('rect')
.attr('width', 20);
recharts は SVG を使用します。
d3 ほど細かくは制御できません。// recharts: React コンポーネントとして描画
import { BarChart, Bar } from 'recharts';
<BarChart width={500} height={300} data={data}>
<Bar dataKey="value" />
</BarChart>
データが変更された際、どのようにグラフを更新するかも重要な違いです。
chart.js は設定オブジェクトを更新し、明示的に更新を呼び出します。
.update() を呼ぶ必要があります。// chart.js: データ更新
chart.data.datasets[0].data = newData;
chart.update();
d3 は「Enter-Update-Exit」パターンを使用します。
// d3: 数据結合と更新
const rects = svg.selectAll('rect').data(newData);
rects.enter().append('rect');
rects.exit().remove();
rects.attr('height', d => d.value);
recharts は React の状態変更に応じて自動で更新されます。
// recharts: 状態変更で自動更新
const [data, setData] = useState(initialData);
// data 状態が変わればグラフも更新される
<BarChart data={data}>...</BarChart>
標準機能以外の表現が必要になった場合の対応力です。
chart.js はプラグインシステムを持っています。
// chart.js: プラグインによる拡張
const plugin = {
id: 'customPlugin',
afterDraw: (chart) => {
// Canvas に直接描画
}
};
Chart.register(plugin);
d3 はほぼ無制限のカスタマイズが可能です。
// d3: 自由な形状描画
svg.append('path')
.datum(data)
.attr('d', d3.line().x(d => d.x).y(d => d.y));
recharts はコンポーネントの組み合わせで拡張します。
d3 ほど自由ではありませんが、React らしい書き方ができます。// recharts: カスタムシェープの使用
<Bar dataKey="value" shape={<CustomShape />} />
React プロジェクトで使用する際、どのくらいの手間がかかるかです。
chart.js はラッパーライブラリ(例:react-chartjs-2)が必要です。
chart.js は React のライフサイクルと自動では連動しません。useRef や useEffect でインスタンスを管理する必要があります。// chart.js + React: 手動管理が必要
useEffect(() => {
const chart = new Chart(ctx, { /*...*/ });
return () => chart.destroy();
}, []);
d3 は完全な手動管理です。
useRef で DOM を取得し、d3 のコードを実行します。d3 の状態を同期させるのは開発者の責任です。// d3 + React: 完全な手動統合
useEffect(() => {
d3.select(ref.current).selectAll('circle').data(data);
}, [data]);
recharts は React 専用に設計されています。
// recharts: 自然な React 統合
<BarChart onClick={(data) => handleClick(data)}>
{/* そのまま JSX として記述 */}
</BarChart>
| 特徴 | chart.js | d3 | recharts |
|---|---|---|---|
| 描画方式 | 🖼️ Canvas | 📐 SVG (DOM) | 📐 SVG (React) |
| 学習コスト | 🟢 低い | 🔴 高い | 🟢 低い |
| 柔軟性 | 🟡 中 (プラグイン) | 🟢 高 (自由) | 🟡 中 (コンポーネント) |
| React 統合 | 🟡 ラッパー必要 | 🔴 手動管理 | 🟢 標準対応 |
| データ量 | 🟢 多いデータに強い | 🟡 少ないデータ向き | 🟡 少ないデータ向き |
chart.js は、手軽に標準的なグラフを導入したい場合 — 特に Canvas のパフォーマンスが必要な場合に最適です。ダッシュボードや管理画面で、複雑なインタラクションよりも表示速度を優先するプロジェクトに向いています。
d3 は、既存のライブラリでは実現できない独自の視覚化が必要な場合に選択します。学習コストは高いですが、技術的な制約几乎なく実装できるため、データジャーナリズムや研究用途、高度な分析ツールに適しています。
recharts は、React プロジェクトで標準的なグラフを宣言的に扱いたい場合に最適です。開発速度と保守性のバランスが良く、多くの Web アプリケーションの要件を満たせます。
結論:まずは recharts(React 使用時)または chart.js(Vanilla JS またはパフォーマンス重視)を検討し、それで要件を満たせない場合のみ d3 の導入を検討するのが現実的な選択です。
標準的なグラフ(折れ線、棒、円など)を素早く実装したい場合に選択します。Canvas ベースのため、大量のデータポイントを描画する際のパフォーマンスが必要なプロジェクトに適しています。設定オブジェクトで完結するため、複雑なカスタマイズよりも手軽さを優先するチームに向いています。
既存のチャート型に当てはまらない、独自の視覚化や複雑なインタラクションが必要な場合に選択します。DOM 要素を直接操作するため、アニメーションやイベント制御を細かく行えます。学習曲線は急ですが、技術的な制約几乎なく実装できる自由度が魅力です。
React プロジェクトで、宣言的にグラフを管理したい場合に選択します。コンポーネントとしてグラフを定義できるため、React の状態管理と自然に統合できます。標準的なチャートタイプで十分であり、SVG ベースのカスタマイズ性も欲しいチームに適しています。
Simple yet flexible JavaScript charting for designers & developers
All the links point to the new version 4 of the lib.
In case you are looking for an older version of the docs, you will have to specify the specific version in the url like this: https://www.chartjs.org/docs/2.9.4/
Instructions on building and testing Chart.js can be found in the documentation. Before submitting an issue or a pull request, please take a moment to look over the contributing guidelines first. For support, please post questions on Stack Overflow with the chart.js tag.
Chart.js is available under the MIT license.