データラベルの表示
データラベルは、チャートの各データポイント上に直接数値やテキストを表示する機能。棒グラフの上に売上額を表示する、円グラフの各セグメントに割合を表示するなど、ツールチップなしで値を読み取れるようにしたい場面で使われる。
プレゼン資料用チャートでの値の直接表示、印刷・PDF出力時のツールチップ代替、データポイントが少ない場合のクイックリーダビリティ向上。
主なバリエーション
- •値の表示(数値・パーセンテージ・カスタムテキスト)
- •表示位置の制御(上・中央・外側・内側)
- •フォーマッタ関数による書式設定
- •重なり防止(auto-hide・offset)
- •条件付き表示(閾値以上のみ表示)
ライブラリ横断比較
| 機能 | Recharts | ECharts | Plotly.js | Chart.js | Nivo | ApexCharts |
|---|---|---|---|---|---|---|
| 値の表示 | ○ LabelList | ○ label.show | ○ text prop | ○ datalabels plugin | ○ enableLabel | ○ dataLabels.enabled |
| 表示位置の制御 | ○ position | ○ position | ○ textposition | ○ anchor/align | ○ labelPosition | ○ offsetY |
| フォーマッタ関数 | ○ formatter | ○ formatter | ○ texttemplate | ○ formatter cb | ○ label fn | ○ formatter |
| 重なり防止 | × | ○ hideOverlap | △ textposition:auto | ○ clamp | ○ labelSkipWidth | △ 部分対応 |
| 条件付き表示 | △ 外部制御 | △ 外部制御 | △ 外部制御 | ○ display cb | ○ labelSkipHeight | △ 外部制御 |
| スタイルカスタマイズ | ○ style | ○ fontSize/color | ○ textfont | ○ font/color | ○ labelTextColor/theme | ○ style |
○ = 対応 △ = 部分対応・制限あり × = 非対応
ライブラリ別コード例
各ライブラリでデータラベルを表示する際の設定部分を抜粋しています。 動くデモは各比較ページでご確認ください。
Recharts
import { LabelList, Bar, BarChart, Line, LineChart } from 'recharts';
// LabelList で各バーの上に値を表示
<BarChart data={data}>
<Bar dataKey="value">
<LabelList
dataKey="value"
position="top" // 'top' | 'bottom' | 'center' | 'insideTop' | 'insideBottom'
style={{ fontSize: 12, fill: '#374151' }}
formatter={(value) => value.toLocaleString()}
/>
</Bar>
</BarChart>
// 折れ線グラフのポイントラベル
<LineChart data={data}>
<Line type="monotone" dataKey="value">
<LabelList
dataKey="value"
position="top"
formatter={(v) => `${v}件`}
style={{ fontSize: 11, fill: '#6b7280' }}
/>
</Line>
</LineChart>ECharts
// ECharts: series[].label でデータラベルを設定
const option = {
series: [{
type: 'bar',
data: [120, 200, 150, 80, 70, 110],
label: {
show: true, // 表示/非表示
position: 'top', // 'top' | 'bottom' | 'inside' | 'insideTop' など
// フォーマッタ
formatter: '{c}', // {c}=value, {b}=name, {a}=seriesName
// formatter: (params) => `${params.value.toLocaleString()}件`,
// スタイル
fontSize: 12,
color: '#374151',
fontWeight: 'bold',
},
// 重なり防止(自動的に隠す)
labelLayout: {
hideOverlap: true,
},
}],
};Plotly.js
// Plotly.js: text と textposition でラベルを表示
const data = [{
type: 'bar',
x: ['1月', '2月', '3月', '4月', '5月'],
y: [100, 150, 130, 170, 200],
// ラベルのデータ(y値と異なるテキストも可)
text: [100, 150, 130, 170, 200].map(v => v.toLocaleString()),
textposition: 'outside', // 'inside' | 'outside' | 'auto' | 'none'
// スタイル
textfont: { size: 12, color: '#374151' },
// 円グラフの場合
// textinfo: 'percent+label',
// texttemplate: '%{label}: %{percent:.1%}',
}];Chart.js
// Chart.js: chartjs-plugin-datalabels プラグインを使用
import ChartDataLabels from 'chartjs-plugin-datalabels';
import { Chart } from 'chart.js';
Chart.register(ChartDataLabels);
const options = {
plugins: {
datalabels: {
display: true,
anchor: 'end', // 'start' | 'center' | 'end'
align: 'top', // 'top' | 'bottom' | 'left' | 'right' | 'center'
// フォーマッタ
formatter: (value, context) => value.toLocaleString(),
// スタイル
font: { size: 11, weight: 'bold' },
color: '#374151',
// 条件付き表示(閾値以上のみ)
display: (context) =>
context.dataset.data[context.dataIndex] > 50,
// 重なり防止
clamp: true,
clip: false,
},
},
};Nivo
import { ResponsiveBar } from '@nivo/bar';
<ResponsiveBar
data={data}
keys={['value']}
indexBy="category"
enableLabel={true} // on/off
label={(d) => d.value.toLocaleString()} // カスタムフォーマット
labelPosition="end" // 'start' | 'middle' | 'end'
labelSkipWidth={32} // 指定幅未満のバーはラベルを非表示(重なり防止)
labelSkipHeight={12} // 指定高さ未満のバーはラベルを非表示
labelTextColor="#ffffff" // ラベルの文字色
/>
// 折れ線グラフ(ResponsiveLine)
<ResponsiveLine
data={data}
pointLabel={(point) => String(point.data.y)}
pointLabelYOffset={-12}
/>ApexCharts
// ApexCharts: dataLabels オブジェクトで設定
const options = {
dataLabels: {
enabled: true, // on/off
// フォーマッタ
formatter: (val, opts) => `${val.toLocaleString()}件`,
// 表示位置の調整(棒グラフ)
offsetY: -20,
// スタイル
style: {
fontSize: '12px',
fontFamily: 'inherit',
fontWeight: 'bold',
colors: ['#374151'],
},
background: {
enabled: false, // ラベルの背景を非表示
},
// ドロップシャドウ
dropShadow: { enabled: false },
},
};まとめ・選び方のヒント
- •組み込みで手軽に追加 → Recharts(LabelList)・ECharts・Nivo・ApexCharts(設定だけで表示可能)
- •外部プラグインが必要 → Chart.js(chartjs-plugin-datalabelsを別途インストール)
- •重なり防止が強力 → ECharts(labelLayout.hideOverlapで自動的に非表示)
- •条件付き表示に対応 → Chart.js(display コールバックで柔軟に制御可能)
- •円グラフのラベル → Plotly.js(textinfo: 'percent+label'で簡単に設定)