複合グラフライブラリ比較
4つの人気ライブラリで棒グラフと折れ線グラフを組み合わせた複合グラフを表示し、実装方法とスタイルを比較
1. Recharts (shadcn/ui風)
ComposedChartコンポーネントの中にBar・Line・Areaを自由に組み合わせられる。YAxis idを指定することで左右に異なるスケールの軸を持つ二軸グラフも簡単に実現。Rechartsの中でも最も柔軟なコンポーネント。
'use client';
import {
ComposedChart, Bar, Line, Area, XAxis, YAxis,
CartesianGrid, Tooltip, Legend, ResponsiveContainer,
} from 'recharts';
const data = [
{ month: '1月', sales: 4200, cost: 2400, rate: 80 },
{ month: '2月', sales: 3800, cost: 1800, rate: 72 },
{ month: '3月', sales: 5100, cost: 2800, rate: 92 },
{ month: '4月', sales: 4600, cost: 2200, rate: 85 },
{ month: '5月', sales: 5400, cost: 3000, rate: 96 },
{ month: '6月', sales: 4900, cost: 2500, rate: 88 },
];
export function RechartsComposedChart() {
return (
<ResponsiveContainer width="100%" height={300}>
<ComposedChart data={data}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="month" />
<YAxis yAxisId="left" />
<YAxis yAxisId="right" orientation="right" domain={[0, 100]} />
<Tooltip />
<Legend />
<Area yAxisId="left" type="monotone" dataKey="cost" fill="#bfdbfe" stroke="#3b82f6" name="コスト" />
<Bar yAxisId="left" dataKey="sales" fill="#10b981" name="売上" />
<Line yAxisId="right" type="monotone" dataKey="rate" stroke="#f97316" strokeWidth={2} name="達成率(%)" />
</ComposedChart>
</ResponsiveContainer>
);
}🤖 AIプロンプトテンプレート
React + Tailwind CSSで、Rechartsを使った複合グラフを実装してください。 - 使用ライブラリ: recharts の ComposedChart、Bar、Line、YAxis(yAxisId指定)、ResponsiveContainer - サンプルデータ: 6ヶ月分の月別売上・コスト・達成率のデータを用意すること - 複合表示: 棒グラフ(売上・コスト)と折れ線グラフ(達成率)を同一チャートに重ねて表示すること - 二重軸: 売上・コストと達成率で異なるY軸スケールを使用すること(yAxisId="left"/"right") - インタラクティブ: ホバー時にツールチップで各系列の数値を表示すること - レスポンシブ: ResponsiveContainerで親要素の幅に応じてチャートサイズが変わるよう対応すること
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
2. Nivo
Nivoには複合グラフ専用コンポーネントはないが、ResponsiveBarのlayersプロパティにカスタムレイヤーを追加することで折れ線を重ねる実装が可能。もしくはResponsiveLineとResponsiveBarをCSSで重ねるアプローチも有効。
'use client';
import { ResponsiveBar } from '@nivo/bar';
const data = [
{ month: '1月', sales: 4200, cost: 2400 },
{ month: '2月', sales: 3800, cost: 1800 },
{ month: '3月', sales: 5100, cost: 2800 },
{ month: '4月', sales: 4600, cost: 2200 },
{ month: '5月', sales: 5400, cost: 3000 },
{ month: '6月', sales: 4900, cost: 2500 },
];
export function NivoComposedChart() {
return (
<div style={{ height: 300 }}>
<ResponsiveBar
data={data}
keys={['sales', 'cost']}
indexBy="month"
margin={{ top: 20, right: 80, bottom: 50, left: 70 }}
padding={0.3}
groupMode="grouped"
colors={['#10b981', '#3b82f6']}
borderRadius={4}
legends={[{
dataFrom: 'keys',
anchor: 'bottom-right',
direction: 'column',
itemWidth: 60,
itemHeight: 20,
}]}
/>
</div>
);
}🤖 AIプロンプトテンプレート
React + Tailwind CSSで、Nivoを使った複合グラフを実装してください。 - 使用ライブラリ: @nivo/bar の ResponsiveBar、layersプロパティにカスタムSVGレイヤーを追加 - サンプルデータ: 6ヶ月分の月別売上・コスト・達成率のデータを用意すること - 複合表示: ResponsiveBarのlayersにカスタムレイヤー関数を渡し、棒グラフの上に折れ線グラフを重ねて表示すること - インタラクティブ: ホバー時にツールチップで各系列の数値を表示すること - レスポンシブ: ResponsiveBarで親要素の幅に応じてチャートサイズが変わるよう対応すること
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
3. Chart.js (react-chartjs-2)
datasetsの各系列にtype: "bar"またはtype: "line"を個別指定するだけで複合グラフを実現。yAxisIDで系列ごとに異なる軸に紐付けることができ、二軸グラフも直感的に実装できる。
'use client';
import { Chart } from 'react-chartjs-2';
import {
Chart as ChartJS, CategoryScale, LinearScale,
BarElement, LineElement, PointElement,
Title, Tooltip, Legend,
} from 'chart.js';
ChartJS.register(CategoryScale, LinearScale, BarElement, LineElement, PointElement, Title, Tooltip, Legend);
const labels = ['1月', '2月', '3月', '4月', '5月', '6月'];
const data = {
labels,
datasets: [
{
type: 'bar' as const,
label: '売上',
data: [4200, 3800, 5100, 4600, 5400, 4900],
backgroundColor: 'rgba(16, 185, 129, 0.8)',
yAxisID: 'y',
},
{
type: 'bar' as const,
label: 'コスト',
data: [2400, 1800, 2800, 2200, 3000, 2500],
backgroundColor: 'rgba(59, 130, 246, 0.8)',
yAxisID: 'y',
},
{
type: 'line' as const,
label: '達成率(%)',
data: [80, 72, 92, 85, 96, 88],
borderColor: '#f97316',
borderWidth: 2,
yAxisID: 'y2',
},
],
};
export function ChartJSComposedChart() {
return (
<Chart type="bar" data={data as any}
options={{
responsive: true,
maintainAspectRatio: false,
scales: {
y: { position: 'left' },
y2: { position: 'right', min: 0, max: 100 },
},
}}
height={300} />
);
}🤖 AIプロンプトテンプレート
React + Tailwind CSSで、Chart.js(react-chartjs-2)を使った複合グラフを実装してください。 - 使用ライブラリ: react-chartjs-2 の Chart コンポーネント、chart.js の CategoryScale・LinearScale・BarElement・LineElement・PointElement - サンプルデータ: 6ヶ月分の月別売上・コスト・達成率のデータを用意すること - 複合表示: datasetsの各系列にtype: "bar"またはtype: "line"を個別指定して棒グラフと折れ線グラフを組み合わせること - 二重軸: yAxisIDで売上・コスト(y)と達成率(y1)を異なる軸に紐付けること - インタラクティブ: ホバー時にツールチップで各系列の数値を表示すること - レスポンシブ: responsive: true、maintainAspectRatio: falseで親要素に合わせたサイズにすること
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
4. ApexCharts (react-apexcharts)
seriesの各要素にtypeを指定するだけで複合グラフを実現。yaxis配列で二軸設定も直感的に記述できる。
チャートを読み込み中...
series の各要素に type: 'bar' / type: 'line' を指定するだけ。stroke.width 配列でbar系列の線を非表示にする。'use client';
import dynamic from 'next/dynamic';
const Chart = dynamic(() => import('react-apexcharts'), { ssr: false });
export function ApexComposedChart() {
const options = {
chart: { type: 'line' as const, toolbar: { show: false } },
xaxis: { categories: ['1月', '2月', '3月', '4月', '5月', '6月'] },
yaxis: [
{ title: { text: '金額(万円)' }, seriesName: '売上' },
{ opposite: true, title: { text: '達成率(%)' }, seriesName: '達成率(%)', min: 0, max: 100 },
],
stroke: { width: [0, 0, 3], curve: 'smooth' as const },
dataLabels: { enabled: false },
colors: ['#10b981', '#3b82f6', '#f97316'],
tooltip: { shared: true },
legend: { show: true },
};
const series = [
{ name: '売上', type: 'bar', data: [4200, 3800, 5100, 4600, 5400, 4900] },
{ name: 'コスト', type: 'bar', data: [2400, 1800, 2800, 2200, 3000, 2500] },
{ name: '達成率(%)', type: 'line', data: [80, 72, 92, 85, 96, 88] },
];
return <Chart type="line" options={options} series={series} height={300} width="100%" />;
}🤖 AIプロンプトテンプレート
React + Tailwind CSSで、ApexCharts(react-apexcharts)を使った複合グラフを実装してください。
- 使用ライブラリ: react-apexcharts の Chart コンポーネント(dynamic importでSSR無効化)
- サンプルデータ: 6ヶ月分の月別売上・コスト・達成率のデータを用意すること
- データ形式: 各系列に { name, type, data } を持つ series 配列を渡すこと(type: 'bar' または 'line')
- グラフ設定: chart.type: "line"(混合グラフ)、toolbar非表示
- 二重軸: yaxis配列で左軸(金額)と右軸(達成率・opposite: true)を設定すること
- スタイリング: stroke.width で棒グラフの系列は [0, 0]、折れ線は [3] を指定すること
- ツールチップ: tooltip.shared: trueで全系列を同時表示すること⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
ライブラリ比較
| ライブラリ | レンダリング | 複合の実装方法 | 二軸対応 | おすすめ用途 |
|---|---|---|---|---|
| Recharts | SVG | ComposedChartで宣言的 | ◎ | Reactアプリ全般 |
| Nivo | SVG | カスタムレイヤーで合成 | △ | デザイン重視のダッシュボード |
| Chart.js | Canvas | type個別指定で簡単 | ◎ | 大量データ・高パフォーマンス |
| ApexCharts | SVG | series単位でtype指定 | ◎ | ダッシュボード・業務グラフ |
選択のポイント
- •Recharts: ComposedChartが専用コンポーネントとして用意されており、最も直感的に複合グラフを実装できる。二軸も宣言的に記述可能。
- •Nivo: 専用コンポーネントはないがカスタムレイヤーで柔軟に対応可能。デザインの一貫性を保ちつつ独自の表現ができる。
- •Chart.js: datasetsにtypeを指定するだけのシンプルな実装。既にChart.jsを導入済みのプロジェクトへの追加コストが低い。
- •ApexCharts:
seriesの各要素にtypeを指定するシンプルな構造で複合グラフを実現。yaxis配列で二軸設定も直感的に記述できる。
典型的な使用例
- 📊売上と達成率の同時表示:棒グラフで売上金額、折れ線グラフで目標達成率を一画面で確認
- 💰収益とコスト比較:収益を棒グラフ、利益率を折れ線グラフで重ねて経営状況を把握
- 👥ユーザー数とエンゲージメント:MAUを棒グラフ、継続率を折れ線グラフで表現
- 📈気温と降水量:気象データの定番表現。異なるスケールの二軸グラフの典型例
⚠️ 使用時の注意点
- •二軸グラフは左右のスケールが異なるため、読み手が混乱しないよう凡例と軸ラベルを明確にする
- •組み合わせる系列は2〜3種類程度に抑え、情報過多にならないようにする
- •棒グラフと折れ線グラフでは視覚的な重みが異なるため、主役となるデータを棒グラフにするのが一般的
- •単位が大きく異なる系列を同一軸に乗せると誤解を招くため、必ず二軸に分けること
コンポーズドチャート(複合グラフ)は、棒グラフと折れ線グラフなど複数のグラフタイプを1つの座標軸上に組み合わせたグラフ。
売上棒グラフ+成長率折れ線グラフ・実績と目標の重ね合わせなど、異なる指標を同一グラフで比較する場面で使われる。
- •棒グラフ+折れ線型
- •棒グラフ+エリア型
- •2軸型(Y軸が2つ)
- •積み上げ棒+折れ線型
- •ラベル付き型
📊 使用しているサンプルデータ(クリックで表示)
6ヶ月分の月別売上(棒グラフ)と目標達成率(折れ線グラフ)を組み合わせたデータを使用しています。
関連する逆引きリファレンス
- → 色・スタイルのカスタマイズ(borderColor・fillOpacity など)
- → ツールチップのカスタマイズ(カスタムHTML・フォーマッタ)
- → 軸(Axis)の設定(ラベルフォーマット・対数スケール・複数軸)
- → レスポンシブ対応(コンテナ追従・アスペクト比・リサイズ)
- → アニメーション・トランジション(初期描画・データ更新・イージング)
- → 凡例(Legend)の配置・スタイル(位置・アイコン・系列トグル)
- → データラベルの表示(値・位置・フォーマッタ)
- → クリックイベント・インタラクション(クリック・ホバー・ブラシ選択)
- → グリッド線のカスタマイズ(表示制御・線スタイル・リファレンスライン)