描き比べ: Chart.js vs ECharts
同一の実データ・同一の系列色で、左にChart.js、右にEChartsを並べています。ツールチップやレジェンドの挙動、アニメーション、記述スタイルの違いを実際に操作して確かめてください。
題材1: 折れ線(東京の平均気温)
「データ点数を増やす」トグルで月次から日次へ切り替えると、点数増加時の描画とツールチップの体感差を確認できます。出典: 気象庁データを加工して作成
import { Line } from "react-chartjs-2";
<Line
data={{
labels,
datasets: [
{
label: "平均気温",
data: values,
borderColor: "#2a78d6",
borderWidth: 2,
pointRadius: dense ? 0 : 3,
tension: 0.2,
},
],
}}
options={{
responsive: true,
maintainAspectRatio: false,
interaction: { mode: "index", intersect: false },
plugins: {
legend: { display: false },
tooltip: {
callbacks: {
label: (ctx) => `平均気温: ${ctx.parsed.y}度`,
},
},
},
scales: {
y: { title: { display: true, text: "気温(度)" } },
},
}}
/>| 比較項目 | Chart.js v4.5.1 | Apache ECharts v6.1.0 |
|---|---|---|
| 抜粋コードの行数 | 33行 | 17行 |
| デフォルトのツールチップ | ポイント単位。軸単位表示はinteraction.modeをindexに変更 | trigger: axisで軸ガイド付きの複数系列表示が1行 |
| 単位の付与 | callbacks.labelで文字列を組み立てる | valueFormatterを渡すだけ |
| React統合 | react-chartjs-2の<Line>にpropsで渡す宣言的スタイル | init/setOption/disposeを自前管理(命令的) |
題材2: 横棒(都道府県人口トップ10、2024年(人口推計))
初回描画のアニメーションと、棒の末尾への値ラベル表示の書き方を比較します。出典: e-Stat(国勢調査・人口推計)を加工して作成
import { Bar } from "react-chartjs-2";
<Bar
data={{
labels: prefNames,
datasets: [
{
label: "人口(万人)",
data: values,
backgroundColor: "#1baf7a",
borderRadius: 2,
},
],
}}
options={{
indexAxis: "y", // 横棒はここで切り替える
plugins: {
legend: { display: false },
tooltip: {
callbacks: {
label: (ctx) =>
`人口: ${ctx.parsed.x.toLocaleString("ja-JP")}万人`,
},
},
// 棒の末尾に値を出すには外部プラグイン
// (chartjs-plugin-datalabels)が必要
},
}}
/>| 比較項目 | Chart.js v4.5.1 | Apache ECharts v6.1.0 |
|---|---|---|
| 抜粋コードの行数 | 29行 | 24行 |
| 横棒への切り替え | indexAxis: 'y' の1行 | xAxis/yAxisのtype定義を入れ替える |
| 値ラベル(データラベル) | 標準機能になく、chartjs-plugin-datalabels等の外部プラグインが必要 | series.labelで標準サポート |
| アニメーション | 全体が同時に伸びる(easeOutQuart) | 既定でカスケード(棒ごとに時間差) |
題材3: ドーナツ(年齢3区分人口、2024年10月1日現在)
レジェンドをクリックして区分を除外したときの、割合表示の再計算挙動を比較してください。出典: e-Stat(国勢調査・人口推計)を加工して作成
import { Doughnut } from "react-chartjs-2";
<Doughnut
data={{
labels: ["0〜14歳", "15〜64歳", "65歳以上"],
datasets: [
{
data: values,
backgroundColor: ["#1baf7a", "#2a78d6", "#4a3aa7"],
borderColor: "#fcfcfb",
borderWidth: 2,
},
],
}}
options={{
cutout: "55%", // ドーナツの内径
plugins: {
legend: { position: "bottom" },
// レジェンドクリックで区分を除外すると
// ツールチップの割合は残り区分で再計算されない点に注意
},
}}
/>| 比較項目 | Chart.js v4.5.1 | Apache ECharts v6.1.0 |
|---|---|---|
| 抜粋コードの行数 | 23行 | 18行 |
| レジェンド連動 | クリックで除外。割合は自前計算のため再計算されない | {d}%が除外後の合計で自動再計算される |
| ラベル表示 | 標準では扇形上のラベルなし(外部プラグイン) | label.formatterで名前と割合を標準表示 |
| ドーナツ化 | cutoutで内径指定 | radiusを[内径, 外径]の配列で指定 |