積み上げ棒グラフライブラリ比較

3つの人気ライブラリで積み上げ棒グラフを表示し、実装方法とスタイルを比較

📊 使用しているサンプルデータ

4つの製品カテゴリー(製品A・B・C・D)の四半期別売上データを使用しています。

[
  {
    "quarter": "Q1",
    "productA": 1200,
    "productB": 800,
    "productC": 600,
    "productD": 400
  },
  {
    "quarter": "Q2",
    "productA": 1500,
    "productB": 950,
    "productC": 750,
    "productD": 500
  },
  {
    "quarter": "Q3",
    "productA": 1800,
    "productB": 1100,
    "productC": 900,
    "productD": 620
  },
  {
    "quarter": "Q4",
    "productA": 2100,
    "productB": 1300,
    "productC": 1050,
    "productD": 750
  }
]

1. Recharts (shadcn/ui風)

BarコンポーネントにstackId="stack"を指定するだけで積み上げが実現。各系列をReactコンポーネントとして宣言的に記述でき、アニメーションも標準対応。

✓ stackId対応✓ 宣言的API✓ レスポンシブ
特徴: stackIdを各Barに指定するだけで実装可能。既存の棒グラフから積み上げへの移行コストが低い。
tsx
'use client';
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';

const data = [
  { quarter: 'Q1', productA: 2400, productB: 1398, productC: 800, productD: 600 },
  { quarter: 'Q2', productA: 1398, productB: 2800, productC: 1200, productD: 900 },
  { quarter: 'Q3', productA: 3200, productB: 1800, productC: 1600, productD: 1100 },
  { quarter: 'Q4', productA: 2800, productB: 3200, productC: 2000, productD: 1400 },
];

export function RechartsStackedBarChart() {
  return (
    <ResponsiveContainer width="100%" height={300}>
      <BarChart data={data}>
        <CartesianGrid strokeDasharray="3 3" />
        <XAxis dataKey="quarter" />
        <YAxis />
        <Tooltip />
        <Legend />
        <Bar dataKey="productA" stackId="stack" fill="#3b82f6" name="製品A" />
        <Bar dataKey="productB" stackId="stack" fill="#10b981" name="製品B" />
        <Bar dataKey="productC" stackId="stack" fill="#8b5cf6" name="製品C" />
        <Bar dataKey="productD" stackId="stack" fill="#f97316" name="製品D" radius={[4, 4, 0, 0]} />
      </BarChart>
    </ResponsiveContainer>
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、Rechartsを使った積み上げ棒グラフを実装してください。

- 使用ライブラリ: recharts(BarChart・Bar・XAxis・YAxis・CartesianGrid・Tooltip・Legend・ResponsiveContainer)
- サンプルデータ: 4製品(製品A・B・C・D)の四半期別売上(Q1〜Q4)を用意すること
- 各BarコンポーネントにstackId="stack"を指定して積み上げを実現すること
- ホバー時にツールチップで各セグメントの値を表示すること
- 凡例を表示すること
- 親要素の幅に応じてチャートサイズが変わるよう対応すること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

2. Nivo

ResponsiveBarにkeys配列とindexByを指定し、groupMode="stacked"で積み上げ表示。凡例・ツールチップが標準で充実しており、labelSkipHeightで小さいセルのラベルを自動非表示にできる。

✓ D3.jsベース✓ 美しいデザイン✓ インタラクティブ
特徴: groupMode="stacked"と"grouped"を切り替えるだけでグループ棒グラフにも変換可能。デザイン性が高くダッシュボード向け。
tsx
'use client';
import { ResponsiveBar } from '@nivo/bar';

const data = [
  { quarter: 'Q1', productA: 2400, productB: 1398, productC: 800, productD: 600 },
  { quarter: 'Q2', productA: 1398, productB: 2800, productC: 1200, productD: 900 },
  { quarter: 'Q3', productA: 3200, productB: 1800, productC: 1600, productD: 1100 },
  { quarter: 'Q4', productA: 2800, productB: 3200, productC: 2000, productD: 1400 },
];

export function NivoStackedBarChart() {
  return (
    <div style={{ height: 300 }}>
      <ResponsiveBar
        data={data}
        keys={['productA', 'productB', 'productC', 'productD']}
        indexBy="quarter"
        margin={{ top: 20, right: 130, bottom: 50, left: 60 }}
        padding={0.3}
        groupMode="stacked"
        colors={['#3b82f6', '#10b981', '#8b5cf6', '#f97316']}
        labelSkipHeight={16}
        legends={[{
          dataFrom: 'keys',
          anchor: 'bottom-right',
          direction: 'column',
          itemWidth: 100,
          itemHeight: 20,
        }]}
      />
    </div>
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、Nivoを使った積み上げ棒グラフを実装してください。

- 使用ライブラリ: @nivo/bar(ResponsiveBar)
- サンプルデータ: 4製品(製品A・B・C・D)の四半期別売上(Q1〜Q4)を用意すること
- keysとindexByを指定し、groupMode="stacked"で積み上げ表示にすること
- labelSkipHeightで小さいセルのラベルを自動非表示にすること
- 凡例を表示すること
- 親要素の幅に応じてチャートサイズが変わるよう対応すること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

3. Chart.js (react-chartjs-2)

datasetsのstacked: trueとscalesのstacked: trueを組み合わせるだけで積み上げが実現。Canvas APIを使用しているため、データ量が多くてもパフォーマンスが安定。

✓ Canvas描画✓ 軽量✓ 大量データ対応
特徴: stacked設定がシンプルで、既にChart.jsを使用しているプロジェクトへの導入が容易。Canvas描画で大量データでも安定動作。
tsx
'use client';
import { Bar } from 'react-chartjs-2';
import {
  Chart as ChartJS, CategoryScale, LinearScale,
  BarElement, Title, Tooltip, Legend,
} from 'chart.js';

ChartJS.register(CategoryScale, LinearScale, BarElement, Title, Tooltip, Legend);

const labels = ['Q1', 'Q2', 'Q3', 'Q4'];

const data = {
  labels,
  datasets: [
    { label: '製品A', data: [2400, 1398, 3200, 2800], backgroundColor: 'rgba(59,130,246,0.8)', stack: 'stack' },
    { label: '製品B', data: [1398, 2800, 1800, 3200], backgroundColor: 'rgba(16,185,129,0.8)', stack: 'stack' },
    { label: '製品C', data: [800, 1200, 1600, 2000], backgroundColor: 'rgba(139,92,246,0.8)', stack: 'stack' },
    { label: '製品D', data: [600, 900, 1100, 1400], backgroundColor: 'rgba(249,115,22,0.8)', stack: 'stack' },
  ],
};

export function ChartJSStackedBarChart() {
  return (
    <Bar data={data}
      options={{ responsive: true, maintainAspectRatio: false, scales: { x: { stacked: true }, y: { stacked: true } } }}
      height={300} />
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、Chart.jsを使った積み上げ棒グラフを実装してください。

- 使用ライブラリ: chart.js(CategoryScale・LinearScale・BarElement・Title・Tooltip・Legend)、react-chartjs-2(Bar)
- サンプルデータ: 4製品(製品A・B・C・D)の四半期別売上(Q1〜Q4)を用意すること
- scalesのx・yにstacked: trueを指定して積み上げを実現すること
- ホバー時にツールチップで各セグメントの値を表示すること
- 凡例をトップに表示すること
- 親要素の幅に応じてチャートサイズが変わるよう対応すること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

ライブラリ比較

ライブラリレンダリング積み上げ実装アニメーションおすすめ用途
RechartsSVGstackIdで簡単Reactアプリ全般
NivoSVGgroupModeで切替可デザイン重視のダッシュボード
Chart.jsCanvasstacked: trueで簡単大量データ・高パフォーマンス

選択のポイント

  • Recharts: stackIdを各Barに指定するだけで実装可能。既存の棒グラフから積み上げへの移行コストが低い。
  • Nivo: groupMode="stacked"と"grouped"を切り替えるだけでグループ棒グラフにも変換可能。デザイン性が高くダッシュボード向け。
  • Chart.js: stacked設定がシンプルで、既にChart.jsを使用しているプロジェクトへの導入が容易。Canvas描画で大量データでも安定動作。

典型的な使用例

  • 📊売上内訳分析:製品・地域・チャネル別の売上を積み上げて合計と内訳を同時に把握
  • 💰予算配分の推移:部門ごとの予算消化状況を時系列で比較
  • 👥ユーザー構成の変化:新規・リピーター・休眠ユーザーの比率推移を可視化
  • 📈市場シェアの変動:複数プレイヤーのシェア変化を積み上げで表現

⚠️ 使用時の注意点

  • 系列数は5〜6個程度に抑える(多すぎると色の識別が困難になる)
  • 各セグメントの正確な値を比較したい場合はグループ棒グラフの方が適している
  • 一番下の系列は比較しやすいが、上の系列ほど基準線がずれて比較が難しくなる
  • 合計値の比較が目的の場合に最も効果を発揮する