chart.js、react-apexcharts、react-chartjs-2、recharts は、Web アプリケーションでデータを視覚化するための代表的なライブラリです。chart.js はキャンバスベースの描画エンジンであり、react-chartjs-2 はそれを React で使うための公式ラッパーです。一方、recharts は React コンポーネントとして宣言的にチャートを描画する SVG ベースのライブラリで、react-apexcharts は高機能な ApexCharts の React 版です。これらはそれぞれ描画方式や React との親和性が異なり、プロジェクトの要件に応じて適切な選択が必要です。
chart.js、react-apexcharts、react-chartjs-2、recharts は、いずれもデータ可視化の強力なツールですが、内部構造と React との付き合い方が大きく異なります。単に「グラフを描く」だけでなく、描画方式(Canvas vs SVG)、設定方法、そしてパフォーマンス特性を理解することが、堅牢なアーキテクチャ選定には不可欠です。
チャートライブラリを選ぶ際、最も根本的な違いは描画エンジンです。これがパフォーマンスとカスタマイズ性に直結します。
chart.js と react-chartjs-2 は Canvas を使用します。
// chart.js (Vanilla JS example)
const ctx = document.getElementById('myChart');
new Chart(ctx, {
type: 'bar',
data: { /* ... */ },
options: { /* ... */ }
});
// react-chartjs-2 (React Component)
import { Bar } from 'react-chartjs-2';
<Bar data={chartData} options={chartOptions} />
recharts は SVG を使用します。
// recharts
import { BarChart, Bar, XAxis, YAxis } from 'recharts';
<BarChart width={500} height={300} data={data}>
<XAxis dataKey="name" />
<YAxis />
<Bar dataKey="uv" fill="#8884d8" />
</BarChart>
react-apexcharts も主に SVG を使用しますが、一部に Canvas を利用する機能もあります。
// react-apexcharts
import ReactApexChart from 'react-apexcharts';
<ReactApexChart
options={chartOptions}
series={seriesData}
type="bar"
width={500}
/>
React プロジェクトにおいて、ライブラリがどのようにコンポーネントとして振る舞うかは、開発体験に大きな影響を与えます。
react-chartjs-2 は chart.js の ラッパー です。
chart.js 形式に整形する手間がかかります。// react-chartjs-2
const data = {
labels: ['A', 'B', 'C'],
datasets: [{ label: 'Sales', data: [10, 20, 30] }]
};
<Bar data={data} />
recharts は ネイティブな React コンポーネント です。
<LineChart> や <Bar /> といったコンポーネントを組み合わせるため、React らしい記述になります。// recharts
<LineChart data={data}>
<Line dataKey="value" stroke="#8884d8" />
{showTooltip && <Tooltip />}
</LineChart>
react-apexcharts も ラッパー です。
options) とデータ系列 (series) を props として渡します。// react-apexcharts
const options = { chart: { type: 'bar' }, xaxis: { categories: [...] } };
const series = [{ name: 'Sales', data: [10, 20, 30] }];
<ReactApexChart options={options} series={series} type="bar" />
chart.js (コアライブラリ) は フレームワーク非依存 です。
useRef と useEffect で手動管理が必要になり、コードが煩雑になります。// chart.js (in React useEffect)
useEffect(() => {
const ctx = canvasRef.current.getContext('2d');
const chart = new Chart(ctx, { type: 'line', data: data });
return () => chart.destroy();
}, [data]);
チャートの見た目や挙動を調整する際のアプローチも異なります。
recharts は コンポーネントベース の設定です。
// recharts: Custom tooltip component
<Tooltip content={<CustomTooltip />} />
chart.js / react-chartjs-2 は 設定オブジェクト ベースです。
options オブジェクト内でネスト深く設定を記述します。// react-chartjs-2: Options object
const options = {
scales: { y: { beginAtZero: true } },
plugins: { legend: { position: 'top' } }
};
react-apexcharts も 設定オブジェクト ベースです。
// react-apexcharts: Detailed options
const options = {
chart: { animations: { enabled: true } },
stroke: { curve: 'smooth', width: 2 }
};
扱うデータサイズによって、適したライブラリは明確に分かれます。
chart.js / react-chartjs-2: Canvas 描画のため、数千件のデータポイントでも比較的安定して動作します。リアルタイム更新が必要なモニタリング画面などに適しています。recharts: SVG 描画のため、データポイントが数百件を超えると描画が重くなることがあります。ダッシュボードや管理画面など、データ量が限定的な用途に向いています。react-apexcharts: 最適化されていますが、SVG ベースのインタラクションが多い場合、大量データでは chart.js に劣ることがあります。| 特徴 | chart.js | react-chartjs-2 | recharts | react-apexcharts |
|---|---|---|---|---|
| 描画方式 | Canvas | Canvas | SVG | SVG / Canvas |
| React 統合 | 手動 (useEffect) | ラッパー | ネイティブコンポーネント | ラッパー |
| 設定方法 | オブジェクト | オブジェクト (props) | JSX / コンポーネント | オブジェクト (props) |
| カスタマイズ | 中 (プラグイン) | 中 (プラグイン) | 高 (CSS/React) | 高 (設定項目) |
| 大規模データ | ◎ | ◎ | △ | ○ |
| 学習コスト | 中 | 中 | 低 | 高 |
プロジェクトの要件に合わせて、以下のように選ぶと失敗が少ないです。
React らしい開発体験を最優先する場合
recharts を選んでください。コンポーネントとして扱えるため、既存の React 知識がそのまま活かせます。カスタマイズ性も高く、管理画面や分析ダッシュボードに最適です。パフォーマンスと標準的なチャートを求める場合
react-chartjs-2 が無難な選択です。chart.js の実績あるエンジンを使いつつ、React での扱いやすさを確保できます。データ更新頻度が高い場合に有利です。リッチな機能とインタラクションが必要な場合
react-apexcharts を検討してください。ズームやパンなどの機能が最初から揃っており、設定の手間を惜しまなければ高機能なチャートが作れます。React を使わない、または極限の軽量さが必要な場合
chart.js 本体を使用します。ただし、React プロジェクトでは react-chartjs-2 を使うのが一般的です。どのライブラリも一長一短ありますが、**「データ量」と「カスタマイズの自由度」**のバランスを考えると、多くの現代的な React アプリケーションでは recharts か react-chartjs-2 のどちらかが最適解になることが多いでしょう。
React 環境以外での利用や、バンドルサイズを極限まで抑えたい場合、あるいは独自の React ラッパーを構築する基盤として必要です。ただし、React プロジェクトで直接使用するのは非効率的なため、通常は react-chartjs-2 の使用を検討してください。
最初から豊富な機能(ズーム、ツールチップ、アニメーション)を求め、設定オブジェクトで細かく制御したいダッシュボード開発に適しています。複雑な設定が必要ですが、視覚的な見栄えが良いチャートを素早く作れます。
chart.js の安定性とエコシステムを React で利用したい場合に最適です。標準的なチャートタイプで十分であり、キャンバス描画によるパフォーマンスが必要な中規模データセットを扱うプロジェクトに向いています。
React のコンポーネント思考でチャートを作り込み、CSS や JSX で細かくスタイルを制御したい場合に最適です。データ量がそれほど多くなく、カスタマイズ性や開発体験(DX)を重視するアプリケーションに適しています。
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.