PieChart
割合や構成比を直感的に表現する円グラフコンポーネントです。 Pie(円)とDonut(ドーナツ)の2バリアントがあり、ラベル位置や中央テキストも自由にカスタマイズできます。
Playground
<Chart config={chartConfig} className="w-full mx-auto aspect-square max-h-[300px]">
<PieChart accessibilityLayer>
<Chart.Tooltip content={<Chart.TooltipContent hideLabel />} />
<Chart.Legend content={<Chart.LegendContent nameKey="key" />} />
<Chart.Pie data={chartData} dataKey="value" nameKey="name" />
</PieChart>
</Chart>JSX Composition
Chart.* は当ライブラリから、その他は Recharts からインポートしてください。
<Chart.Legend />CSSオーバーレイ(donutのみ)Patterns
PieChartの主要な表示パターンです。用途に応じて使い分けてください。
Default Pie
基本的な円グラフ
Donut
ドーナツ型 + 中央ラベル
Outside Labels
外部ラベル + 凡例付き
Styled Donut
パディング + 角丸のスタイル付きドーナツ
Tooltip Styles
Chart.TooltipContentのindicatorpropで、ツールチップのインジケーター形状を変更できます。
Dot (default)
デフォルトのドットインジケーター
indicator="dot"Line
垂直線のインジケーター
indicator="line"Dashed
破線のインジケーター
indicator="dashed"API
Component Structure
Chart— Recharts.PiePropsパイ(variant・label・activeShape).Tooltipツールチップラッパー.TooltipContentPropsツールチップ内容.Legendレジェンドラッパー.LegendContentレジェンド内容Props
Chart
config—ChartConfigチャートの設定オブジェクト (ラベル・カラー定義)
children—ReactElementRechartsチャートコンポーネント
idundefinedstringチャートのユニークID (CSS変数スコーピング用)
| Name | Type | Default | Description |
|---|---|---|---|
config | ChartConfig | — | チャートの設定オブジェクト (ラベル・カラー定義) |
children | ReactElement | — | Rechartsチャートコンポーネント |
id | string | undefined | チャートのユニークID (CSS変数スコーピング用) |
Chart.Pie
variant"pie""pie" | "donut"形状。"donut" は innerRadius を自動設定
label"none""none" | "outside" | "inside"ラベル位置。outside=引き出し線、inside=スライス内部 (小さいスライスは自動非表示)
labelContent"value""value" | "percent"ラベルに表示する内容
activeShapetruebooleanホバー時にスライスを拡大する効果
innerRadius0 (pie) / 60 (donut)number内側の半径。variant で自動設定されるが、直接上書きも可能
paddingAngle0numberスライス間の間隔 (度)
cornerRadius0numberスライスの角丸
startAngle90number開始角度 (90 = 12時方向)
endAngle-270number終了角度
| Name | Type | Default | Description |
|---|---|---|---|
variant | "pie" | "donut" | "pie" | 形状。"donut" は innerRadius を自動設定 |
label | "none" | "outside" | "inside" | "none" | ラベル位置。outside=引き出し線、inside=スライス内部 (小さいスライスは自動非表示) |
labelContent | "value" | "percent" | "value" | ラベルに表示する内容 |
activeShape | boolean | true | ホバー時にスライスを拡大する効果 |
innerRadius | number | 0 (pie) / 60 (donut) | 内側の半径。variant で自動設定されるが、直接上書きも可能 |
paddingAngle | number | 0 | スライス間の間隔 (度) |
cornerRadius | number | 0 | スライスの角丸 |
startAngle | number | 90 | 開始角度 (90 = 12時方向) |
endAngle | number | -270 | 終了角度 |
Chart.TooltipContent
indicator"dot""dot" | "line" | "dashed"インジケーターの形状
hideLabelfalsebooleanラベルを非表示にする
hideIndicatorfalsebooleanインジケーターを非表示にする
colorundefinedstringインジケーターの色を直接指定
nameKeyundefinedstringデータキーの名前マッピング
labelKeyundefinedstringラベルキーのマッピング
labelFormatterundefined(value, payload) => ReactNodeラベルのカスタムフォーマッター
formatterundefined(value, name, item, index, payload) => ReactNode値のカスタムフォーマッター
| Name | Type | Default | Description |
|---|---|---|---|
indicator | "dot" | "line" | "dashed" | "dot" | インジケーターの形状 |
hideLabel | boolean | false | ラベルを非表示にする |
hideIndicator | boolean | false | インジケーターを非表示にする |
color | string | undefined | インジケーターの色を直接指定 |
nameKey | string | undefined | データキーの名前マッピング |
labelKey | string | undefined | ラベルキーのマッピング |
labelFormatter | (value, payload) => ReactNode | undefined | ラベルのカスタムフォーマッター |
formatter | (value, name, item, index, payload) => ReactNode | undefined | 値のカスタムフォーマッター |
Chart.LegendContent
hideIconfalsebooleanアイコンを非表示にする
nameKeyundefinedstringデータキーの名前マッピング
verticalAlign"bottom""top" | "middle" | "bottom"垂直位置
align"center""left" | "center" | "right"水平位置
layout"horizontal""horizontal" | "vertical"レイアウト方向
| Name | Type | Default | Description |
|---|---|---|---|
hideIcon | boolean | false | アイコンを非表示にする |
nameKey | string | undefined | データキーの名前マッピング |
verticalAlign | "top" | "middle" | "bottom" | "bottom" | 垂直位置 |
align | "left" | "center" | "right" | "center" | 水平位置 |
layout | "horizontal" | "vertical" | "horizontal" | レイアウト方向 |
Customization
ドーナツ型の中央ラベルはCSSオーバーレイで実装するため、HTMLコンテンツを自由にカスタマイズできます。
数値 + ラベル
<div className="absolute inset-0 flex flex-col items-center justify-center pointer-events-none">
<span className="text-3xl font-bold">925</span>
<span className="text-sm text-text-muted">Total</span>
</div>アイコン + パーセント
<div className="absolute inset-0 flex flex-col items-center justify-center pointer-events-none">
<TrendingUp className="icon-md text-success" />
<span className="text-lg font-bold">+12%</span>
<span className="text-xs text-text-muted">Growth</span>
</div>リッチコンテンツ
<div className="absolute inset-0 flex flex-col items-center justify-center pointer-events-none">
<span className="text-xs text-text-muted">Revenue</span>
<span className="text-2xl font-bold">$4.2k</span>
<span className="text-xs font-semibold text-success">+8.5%</span>
</div>Tip:中央ラベルはCSSオーバーレイ(absolute + pointer-events-none)で実装するため、テキスト・アイコン・カスタムコンポーネントなど、あらゆるHTMLコンテンツを自由に配置できます。
Anatomy
Best Practices
推奨
- ✓スライス数は5〜6個以内に抑える
- ✓ドーナツ型で中央に合計値やKPIを表示する
- ✓Tooltipで正確な数値を提供する
- ✓Legendで各スライスを識別可能にする
- ✓accessibilityLayerを必ず有効にする
避けるべき
- ✗7個以上のスライスで使わない(BarChartの方が適切)
- ✗類似した値が多い場合は避ける(差が見えない)
- ✗時系列データには使わない(LineChart推奨)
- ✗色だけで区別させない(Legendやラベルを併用)
Accessibility
キーボード操作
ARIA / WCAG
- Tooltipでデータ値をテキストで提供
- Legendでスライスを識別可能
- カラートークンでダークモード自動対応
- activeShapeでホバーフィードバック提供
accessibilityLayerキーボード+SR対応