recharts
Rechartsライブラリを使用して、柔軟に組み合わせ可能なレスポンシブなReactチャートを構築します。折れ線グラフ・エリアグラフ・棒グラフ・円グラフ・散布図・複合グラフなどのデータ可視化を作成する際に使用します。チャートのカスタマイズ、レスポンシブなサイジング、ツールチップ、凡例、軸の設定、パフォーマンス最適化、アクセシビリティにも対応します。
description の原文を見る
Build composable, responsive React charts with Recharts library. Use when creating data visualizations including line charts, area charts, bar charts, pie charts, scatter plots, and composed charts. Handles chart customization, responsive sizing, tooltips, legends, axes configuration, performance optimization, and accessibility.
SKILL.md 本文
Recharts
D3の上に構築されたReact チャーティングライブラリで、合成可能で宣言的なデータビジュアライゼーションを提供します。
クイックスタート
1. Recharts をインストール
npm install recharts
2. 基本的なチャート構造
すべての Recharts チャートは同じパターンに従います:
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';
const data = [
{ name: 'Jan', sales: 4000, profit: 2400 },
{ name: 'Feb', sales: 3000, profit: 1398 },
{ name: 'Mar', sales: 2000, profit: 9800 },
];
<ResponsiveContainer width="100%" height={300}>
<LineChart data={data}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="name" />
<YAxis />
<Tooltip />
<Legend />
<Line type="monotone" dataKey="sales" stroke="#8884d8" />
<Line type="monotone" dataKey="profit" stroke="#82ca9d" />
</LineChart>
</ResponsiveContainer>
コアコンセプト
データフォーマット
Recharts は オブジェクトの配列 としてのデータを想定しています。各オブジェクトはデータポイントを表します:
const data = [
{ month: 'Jan', revenue: 4000, expenses: 2400 },
{ month: 'Feb', revenue: 3000, expenses: 1398 },
];
dataKey プロップを使用してオブジェクトのプロパティをチャートコンポーネントにマップします:
dataKey="revenue"- revenue プロパティにマップdataKey={(entry) => entry.revenue - entry.expenses}- 計算値用の関数
コンポーネント合成
チャートは特殊なコンポーネントをネストすることで構築されます:
サイズ設定: responsive プロップ (v3.3+)、ResponsiveContainer ラッパー、または width/height を直接設定します
チャートタイプ (1つを選択):
LineChart- 折れ線グラフと面グラフBarChart- 棒グラフと列グラフAreaChart- スタック型および塗りつぶし面グラフPieChart- 円グラフとドーナツグラフScatterChart- 散布図とバブルチャートComposedChart- 複数のチャートタイプを混合RadarChart- レーダー/スパイダーチャートRadialBarChart- 円形棒グラフ
一般的な子コンポーネント:
XAxis/YAxis- 軸の設定CartesianGrid- グリッドラインTooltip- ホバー時の情報表示Legend- シリーズの識別Line/Bar/Area/Pie- データシリーズの表示
チャートタイプ別パターン
折れ線グラフ
<LineChart data={data}>
<XAxis dataKey="name" />
<YAxis />
<CartesianGrid strokeDasharray="3 3" />
<Tooltip />
<Legend />
<Line type="monotone" dataKey="value" stroke="#8884d8" strokeWidth={2} dot={{ r: 4 }} />
</LineChart>
主要なプロップ:
type: "monotone" (スムーズ)、"linear"、"step"、"natural"stroke: 線の色strokeWidth: 線の太さdot: ポイントのスタイリング (falseに設定するとポイントを非表示)activeDot: ホバー時のポイントのスタイリングconnectNulls: true に設定するとギャップを接続
面グラフ
<AreaChart data={data}>
<defs>
<linearGradient id="colorValue" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor="#8884d8" stopOpacity={0.8}/>
<stop offset="95%" stopColor="#8884d8" stopOpacity={0}/>
</linearGradient>
</defs>
<XAxis dataKey="name" />
<YAxis />
<CartesianGrid strokeDasharray="3 3" />
<Tooltip />
<Area type="monotone" dataKey="value" stroke="#8884d8" fillOpacity={1} fill="url(#colorValue)" />
</AreaChart>
スタック型面グラフ:
<Area type="monotone" dataKey="sales" stackId="1" stroke="#8884d8" fill="#8884d8" />
<Area type="monotone" dataKey="profit" stackId="1" stroke="#82ca9d" fill="#82ca9d" />
棒グラフ
<BarChart data={data}>
<XAxis dataKey="name" />
<YAxis />
<CartesianGrid strokeDasharray="3 3" />
<Tooltip />
<Legend />
<Bar dataKey="sales" fill="#8884d8" radius={[4, 4, 0, 0]} />
<Bar dataKey="profit" fill="#82ca9d" radius={[4, 4, 0, 0]} />
</BarChart>
主要なプロップ:
fill: 棒の色radius: 丸みのあるコーナー [左上、右上、右下、左下] または全てのコーナー用の単一の数値barSize: 固定の棒の幅stackId: 棒をスタックにグループ化shape: カスタム棒の形状 (関数またはエレメント)
スタック型の棒:
<Bar dataKey="sales" stackId="a" fill="#8884d8" />
<Bar dataKey="profit" stackId="a" fill="#82ca9d" />
丸みのあるスタック型の棒 (BarStack を使用してスタック全体を丸くします):
import { BarStack } from 'recharts';
<BarChart data={data}>
<BarStack stackId="a" radius={[4, 4, 0, 0]}>
<Bar dataKey="sales" fill="#8884d8" />
<Bar dataKey="profit" fill="#82ca9d" />
</BarStack>
</BarChart>
円グラフ
const COLORS = ['#0088FE', '#00C49F', '#FFBB28', '#FF8042'];
<PieChart>
<Pie
data={data}
dataKey="value"
nameKey="name"
cx="50%"
cy="50%"
innerRadius={60}
outerRadius={80}
paddingAngle={5}
shape={(props) => <Sector {...props} fill={COLORS[props.index % COLORS.length]} />}
/>
<Tooltip />
<Legend />
</PieChart>
主要なプロップ:
innerRadius: 0より大きい場合はドーナツグラフを作成outerRadius: 円グラフのサイズpaddingAngle: スライス間のギャップstartAngle/endAngle: 部分円グラフ (デフォルト: 0〜360)label: スライスに値を表示shape: 各スライスのカスタムレンダー (非推奨のCellコンポーネントを置き換え)
散布図
<ScatterChart>
<XAxis type="number" dataKey="x" name="X Axis" />
<YAxis type="number" dataKey="y" name="Y Axis" />
<CartesianGrid />
<Tooltip cursor={{ strokeDasharray: '3 3' }} />
<Scatter name="Series A" data={data} fill="#8884d8" />
</ScatterChart>
複合チャート
複数のチャートタイプを混合:
<ComposedChart data={data}>
<XAxis dataKey="name" />
<YAxis />
<CartesianGrid stroke="#f5f5f5" />
<Tooltip />
<Legend />
<Area type="monotone" dataKey="total" fill="#8884d8" stroke="#8884d8" />
<Bar dataKey="sales" barSize={20} fill="#413ea0" />
<Line type="monotone" dataKey="profit" stroke="#ff7300" />
</ComposedChart>
レスポンシブサイジング
オプション 1: responsive プロップ (Recharts 3.3+、推奨)
チャート自体に responsive を設定します。標準的な CSS サイジングルールを使用します:
<LineChart data={data} width="100%" height={300} responsive>
{/* chart components */}
</LineChart>
Flexbox と CSS グリッドレイアウトで動作します。CSS style プロップもサポートしています:
<LineChart data={data} responsive style={{ maxWidth: 800, width: '100%', aspectRatio: '16/9' }}>
{/* chart components */}
</LineChart>
オプション 2: ResponsiveContainer (古いバージョン)
Recharts < 3.3 の場合は、チャートを ResponsiveContainer でラップします:
<ResponsiveContainer width="100%" height={300}>
<LineChart data={data}>
{/* chart components */}
</LineChart>
</ResponsiveContainer>
重要: ResponsiveContainer は定義された寸法を持つ親を必要とします。高さは数値である必要があり、パーセンテージではありません。
静的サイジング
width と height をピクセルまたはパーセンテージとして直接設定:
<LineChart data={data} width={600} height={300}>
{/* chart components */}
</LineChart>
軸の設定
XAxis / YAxis プロップ
<XAxis
dataKey="name" // 表示するプロパティ
type="category" // "category" または "number"
domain={[0, 'dataMax']} // 軸の範囲
tick={{ fill: '#666' }} // 目盛りのスタイリング
tickFormatter={(value) => `$${value}`} // ラベルのフォーマット
angle={-45} // ラベルを回転
textAnchor="end" // テキスト配置
height={60} // ラベル用の追加スペース
/>
軸のタイプ
- カテゴリ軸 (X のデフォルト): 値を離散ラベルとして扱う
- 数値軸 (Y のデフォルト): 値を連続スケールとして扱う
カスタム定義域
軸の範囲を制御:
// 固定範囲
<YAxis domain={[0, 100]} />
// パディング付きの自動
<YAxis domain={[0, 'auto']} />
// データベースの溢れ許可
<YAxis domain={[0, 'dataMax + 100']} allowDataOverflow />
// 対数スケール
<YAxis type="number" scale="log" domain={['auto', 'auto']} />
カスタマイズ
カスタムツールチップ
const CustomTooltip = ({ active, payload, label }) => {
if (active && payload && payload.length) {
return (
<div className="custom-tooltip">
<p className="label">{`${label}`}</p>
<p className="intro">{`Sales: ${payload[0].value}`}</p>
<p className="desc">追加情報...</p>
</div>
);
}
return null;
};
<Tooltip content={<CustomTooltip />} />
カスタム凡例
const CustomLegend = ({ payload }) => (
<ul>
{payload.map((entry, index) => (
<li key={`item-${index}`} style={{ color: entry.color }}>
{entry.value}
</li>
))}
</ul>
);
<Legend content={<CustomLegend />} />
カスタム形状
カスタム棒の形状:
const CustomBar = (props) => {
const { x, y, width, height, fill } = props;
return <path d={`M${x},${y} ...`} fill={fill} />;
};
<Bar shape={<CustomBar />} dataKey="sales" />
// または
<Bar shape={(props) => <CustomBar {...props} />} dataKey="sales" />
カスタムラベル
<Line
dataKey="sales"
label={{ position: 'top', fill: '#666', fontSize: 12 }}
/>
// カスタムラベルコンポーネント
<Line
dataKey="sales"
label={<CustomLabel />}
/>
スタイリング
チャートのスタイル:
<LineChart style={{ backgroundColor: '#f5f5f5' }}>
軸のスタイリング:
<XAxis
axisLine={{ stroke: '#666' }}
tickLine={{ stroke: '#666' }}
tick={{ fill: '#666', fontSize: 12 }}
/>
グリッドのスタイリング:
<CartesianGrid strokeDasharray="3 3" stroke="#e0e0e0" />
インタラクション
アクティブ要素とインタラクション制御
Tooltip コンポーネントはアクティブ要素のハイライト表示を制御します。activeIndex プロップを使用しないでください (v3で削除されました)。
ツールチップインタラクションプロップ:
defaultIndex: レンダリング時にハイライトする初期アイテムを設定active: true の場合、インタラクション終了後もツールチップはアクティブなままですtrigger:"hover"(デフォルト) または"click"クリックベースのインタラクションcontent: カスタムコンテンツまたは() => nullツールチップテキストを非表示にしつつハイライトを保持cursor: プロット領域の視覚的なカーソル、falseに設定して非表示
{/* クリックベースのインタラクションと非表示のツールチップテキスト */}
<Tooltip trigger="click" content={() => null} cursor={false} />
{/* レンダリング時にハイライトするデフォルトアイテム */}
<Tooltip defaultIndex={2} />
クリックイベント
<LineChart onClick={(e) => console.log(e)}>
<Bar
dataKey="sales"
onClick={(data, index) => console.log('Bar clicked:', data)}
/>
</LineChart>
同期チャート
syncId を使用して複数のチャートをリンク:
<LineChart data={data1} syncId="anyId">
{/* components */}
</LineChart>
<LineChart data={data2} syncId="anyId">
{/* components - tooltips synchronize */}
</LineChart>
ズーム用のブラシ
<LineChart data={data}>
{/* other components */}
<Brush dataKey="name" height={30} stroke="#8884d8" />
</LineChart>
パフォーマンス最適化
1. 安定した参照
プロップに useMemo と useCallback を使用:
// 悪い例 - 毎回レンダリングで新しい関数が生成される
<Line dataKey={(entry) => entry.sales * 2} />
// 良い例 - 安定した参照
const dataKey = useCallback((entry) => entry.sales * 2, []);
<Line dataKey={dataKey} />
2. コンポーネントをメモ化
const MemoizedChart = React.memo(({ data }) => (
<LineChart data={data}>
{/* components */}
</LineChart>
));
3. 変更されるコンポーネントを分離
頻繁に更新されるコンポーネントを分離:
const Chart = () => {
const [hoveredData, setHoveredData] = useState(null);
return (
<LineChart>
{/* 静的コンポーネント */}
<Line dataKey="sales" />
{/* 動的オーバーレイ */}
<ReferenceLine x={hoveredData?.x} stroke="red" />
</LineChart>
);
};
4. イベントをデバウンス
import { useDebouncedCallback } from 'use-debounce';
const handleMouseMove = useDebouncedCallback((e) => {
setPosition(e.activeLabel);
}, 10);
<LineChart onMouseMove={handleMouseMove}>
5. データポイント数を削減
大規模なデータセットの場合は、集計を検討してください:
// レンダリング前にデータをビン化
const binnedData = useMemo(() => {
return d3.bin().value(d => d.x)(rawData);
}, [rawData]);
アクセシビリティ
Recharts には組み込みのアクセシビリティサポートが含まれています:
<LineChart accessibilityLayer={true}>
<Line dataKey="sales" name="Monthly Sales" />
</LineChart>
アクセシビリティはデフォルトで有効です。チャートはキーボードナビゲーション対応で、スクリーンリーダーと互換性があります。
ARIA プロップ:
<LineChart role="img" aria-label="月間収益を表すセールスチャート">
一般的なパターン
複数のデータシリーズ
<LineChart data={data}>
<XAxis dataKey="month" />
<YAxis />
<Tooltip />
<Legend />
<Line type="monotone" dataKey="productA" name="Product A" stroke="#8884d8" />
<Line type="monotone" dataKey="productB" name="Product B" stroke="#82ca9d" />
<Line type="monotone" dataKey="productC" name="Product C" stroke="#ffc658" />
</LineChart>
横棒グラフ
<BarChart layout="vertical" data={data}>
<XAxis type="number" />
<YAxis type="category" dataKey="name" />
<Bar dataKey="value" />
</BarChart>
ドーナツグラフ
const COLORS = ['#0088FE', '#00C49F', '#FFBB28', '#FF8042'];
<PieChart>
<Pie
data={data}
innerRadius={60}
outerRadius={80}
paddingAngle={5}
dataKey="value"
shape={(props) => <Sector {...props} fill={COLORS[props.index % COLORS.length]} />}
/>
</PieChart>
注記:
Cellコンポーネントは非推奨であり、Recharts 4.0 で削除される予定です。代わりにBar、Pie、Scatterなどのshapeプロップを使用してください。
参照線/領域
<LineChart data={data}>
{/* ... */}
<ReferenceLine y={5000} label="Target" stroke="red" strokeDasharray="3 3" />
<ReferenceArea x1="Jan" x2="Mar" fill="#8884d8" fillOpacity={0.1} />
</LineChart>
エラーバー
<ScatterChart>
<Scatter data={data}>
<ErrorBar dataKey="errorX" width={4} strokeWidth={2} />
<ErrorBar dataKey="errorY" width={4} strokeWidth={2} direction="y" />
</Scatter>
</ScatterChart>
統合パターン
状態管理との連携
const SalesChart = () => {
const [timeRange, setTimeRange] = useState('month');
const data = useSelector(state => selectSalesData(state, timeRange));
return (
<ResponsiveContainer>
<LineChart data={data}>
{/* components */}
</LineChart>
</ResponsiveContainer>
);
};
リアルタイムデータとの連携
const RealtimeChart = () => {
const [data, setData] = useState([]);
useEffect(() => {
const interval = setInterval(() => {
setData(prev => [...prev.slice(-20), newDataPoint]);
}, 1000);
return () => clearInterval(interval);
}, []);
return (
<LineChart data={data}>
<XAxis dataKey="time" />
<YAxis domain={['auto', 'auto']} />
<Line type="monotone" dataKey="value" isAnimationActive={false} />
</LineChart>
);
};
Z-Index とレイヤリング (v3.4+)
コンポーネントはデフォルトの順序でレンダリングされます (グリッド < 軸 < チャート要素 < ツールチップ/凡例)。zIndex プロップで上書きします:
<Line dataKey="sales" zIndex={10} /> // 上に表示
直接の zIndex サポートのないコンポーネントの場合は、ZIndexLayer でラップします:
import { ZIndexLayer } from 'recharts';
<ZIndexLayer zIndex={5}>
<CustomAnnotation />
</ZIndexLayer>
座標システム
Recharts には 3 つの座標システムがあります:
- ドメイン座標 - データ値 (例:
x="March"、y=5000)。ReferenceLine、ReferenceDot、ReferenceAreaで使用。自動的にピクセルに変換されます。 - ピクセル座標 - チャート viewBox に相対的なポジション。カスタム SVG 形状で使用。
usePlotArea()、useOffset()、useChartWidth()フックで利用可能。 - マウスイベント座標 - ブラウザビューポート座標。
getRelativeCoordinate(event, element)で変換します。
システム間の変換:
- データからピクセル:
useXAxisScale()、useYAxisScale() - ピクセルからデータ:
useXAxisInverseScale()、useYAxisInverseScale()
トラブルシューティング
チャートがレンダリングされない
ResponsiveContainerが定義された寸法を持つ親を持つことを確認- 高さが数値であることを確認 (ResponsiveContainer ではパーセンテージではない)
- データがオブジェクトの配列であることを確認
ツールチップが表示されない
- Tooltip コンポーネントが含まれていることを確認
- dataKey 値がデータオブジェクトに存在することを確認
軸ラベルが重複している
- ラベルを回転:
<XAxis angle={-45} textAnchor="end" height={80} /> - interval を使用:
<XAxis interval={0} />(0 = すべて表示、'preserveStartEnd' = 自動)
アニメーションの問題
- 無効化:
<Line isAnimationActive={false} /> - 期間を短縮:
<Line animationDuration={500} />
リソース
リファレンス
API リファレンス- 完全なコンポーネント プロップと API の詳細例- 一般的なチャートパターンとコードスニペットベストプラクティス- パフォーマンスと設計ガイドライン
外部リソース
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- ansanabria
- リポジトリ
- ansanabria/skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/ansanabria/skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。