散布図ライブラリ比較

6つの人気ライブラリで散布図を表示し、データの相関関係の表現方法を比較

1. Recharts

ScatterChartコンポーネントで直感的に散布図を描画。ZAxisによるバブルチャート拡張も可能

✓ ZAxis対応✓ 複数系列✓ レスポンシブ
特徴: ZAxisを追加すればデータポイントのサイズを第3変数で制御でき、 バブルチャートへの拡張も容易。ツールチップに単位付きの値を表示可能。
tsx
'use client';
import { ScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';

const data = [
  { x: 10, y: 30 }, { x: 40, y: 100 }, { x: 60, y: 50 },
  { x: 80, y: 120 }, { x: 100, y: 80 }, { x: 120, y: 150 },
];

export function RechartsScatterChart() {
  return (
    <ResponsiveContainer width="100%" height={300}>
      <ScatterChart>
        <CartesianGrid strokeDasharray="3 3" />
        <XAxis dataKey="x" name="X" />
        <YAxis dataKey="y" name="Y" />
        <Tooltip cursor={{ strokeDasharray: '3 3' }} />
        <Scatter data={data} fill="#3b82f6" />
      </ScatterChart>
    </ResponsiveContainer>
  );
}

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

React + Tailwind CSSで、Rechartsを使った散布図を実装してください。

- 使用ライブラリ: recharts(ScatterChart、Scatter、XAxis、YAxis、ZAxis、CartesianGrid、Tooltip、Legend、ResponsiveContainer)
- サンプルデータ: 2製品の広告費と売上の関係(各10件)を用意すること
- インタラクティブ: ホバー時にツールチップでX・Y軸の正確な値(単位付き)を表示すること
- グループ区別: Scatterコンポーネントを複数配置し、fillカラーで製品ごとに色分けして表示すること
- レスポンシブ: ResponsiveContainerで親要素の幅に応じてチャートサイズが変わるよう対応すること
- 拡張: ZAxisを使えばデータポイントのサイズを第3変数で制御してバブルチャートに拡張できることをコメントで示すこと

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

2. Nivo

ResponsiveScatterPlotで美しいデザインのインタラクティブな散布図を描画

✓ 美しいデフォルト✓ ノードサイズ可変✓ D3.jsパワー
特徴: D3.jsの豊富な機能を活かし、ノードサイズのカスタマイズや メッシュベースのインタラクションなど高度な機能を備えています。
tsx
'use client';
import { ResponsiveScatterPlot } from '@nivo/scatterplot';

const data = [
  {
    id: 'グループA',
    data: [
      { x: 10, y: 30 }, { x: 40, y: 100 }, { x: 60, y: 50 },
      { x: 80, y: 120 }, { x: 100, y: 80 },
    ],
  },
];

export function NivoScatterChart() {
  return (
    <div style={{ height: 300 }}>
      <ResponsiveScatterPlot
        data={data}
        margin={{ top: 20, right: 20, bottom: 50, left: 60 }}
        xScale={{ type: 'linear', min: 0, max: 120 }}
        yScale={{ type: 'linear', min: 0, max: 160 }}
        colors={['#3b82f6']}
        nodeSize={10}
        useMesh={true}
      />
    </div>
  );
}

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

React + Tailwind CSSで、Nivoを使った散布図を実装してください。

- 使用ライブラリ: @nivo/scatterplot(ResponsiveScatterPlot)
- サンプルデータ: 2製品の広告費と売上の関係(各10件)をNivo形式({id, data: [{x, y}]})で用意すること
- インタラクティブ: ホバー時にツールチップでX・Y軸の正確な値を表示すること(useMesh: true)
- グループ区別: colorsプロパティで製品ごとに色分けし、凡例を表示すること
- レスポンシブ: ResponsiveScatterPlotで親要素の幅に応じてチャートサイズが変わるよう対応すること
- 軸ラベル: axisBottomとaxisLeftのlegendプロパティで軸のラベル(広告費・売上)を表示すること

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

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

Canvas描画による高パフォーマンスな散布図。大量のデータポイントもスムーズに表示

✓ Canvas高速描画✓ 軸ラベル対応✓ 大量データ対応
特徴: Canvas APIを使用しているため数千のデータポイントでもスムーズに動作。 軸にタイトルを簡単に追加でき、ポイントのスタイルも柔軟に設定可能。
tsx
'use client';
import { Scatter } from 'react-chartjs-2';
import { Chart as ChartJS, LinearScale, PointElement, Tooltip, Legend } from 'chart.js';

ChartJS.register(LinearScale, PointElement, Tooltip, Legend);

const data = {
  datasets: [
    {
      label: 'グループA',
      data: [
        { x: 10, y: 30 }, { x: 40, y: 100 }, { x: 60, y: 50 },
        { x: 80, y: 120 }, { x: 100, y: 80 }, { x: 120, y: 150 },
      ],
      backgroundColor: 'rgba(59, 130, 246, 0.7)',
    },
  ],
};

export function ChartJSScatterChart() {
  return <Scatter data={data} options={{ responsive: true, maintainAspectRatio: false }} height={300} />;
}

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

React + Tailwind CSSで、Chart.js(react-chartjs-2)を使った散布図を実装してください。

- 使用ライブラリ: react-chartjs-2(Scatter)、chart.js(LinearScale、PointElement、Title、Tooltip、Legend)
- サンプルデータ: 2製品の広告費と売上の関係(各10件)を{x, y}形式で用意すること
- インタラクティブ: ホバー時にツールチップでX・Y軸の正確な値を表示すること
- グループ区別: datasetsを製品ごとに分けてbackgroundColorとborderColorで色分けして表示すること
- レスポンシブ: responsive: true、maintainAspectRatio: falseで親要素に合わせてサイズを調整すること
- 軸ラベル: scalesのx・yそれぞれにtitle.display: trueと軸名(広告費・売上)を設定すること

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

4. Plotly.js (react-plotly.js)

ズーム・パン・ホバーが標準装備。散布図での相関分析や科学データの可視化に最適。

✓ ズーム・パン標準✓ 科学系データ向け✓ インタラクティブ

チャートを読み込み中...

特徴: ズーム・パン・ホバーなどのインタラクティブ機能が標準装備。 SSRには非対応のためdynamic importが必要。
tsx
'use client';
import dynamic from 'next/dynamic';
const Plot = dynamic(() => import('react-plotly.js'), { ssr: false });

export function PlotlyScatterChart() {
  return (
    <Plot
      data={[
        {
          type: 'scatter',
          mode: 'markers',
          x: [120, 200, 150, 280, 320, 180, 250, 350, 100, 220],
          y: [340, 480, 390, 620, 710, 420, 560, 780, 290, 510],
          name: '製品A',
          marker: { color: '#6366f1', size: 10 },
        },
        {
          type: 'scatter',
          mode: 'markers',
          x: [100, 180, 140, 260, 300, 160, 230, 340, 110, 200],
          y: [210, 350, 280, 440, 520, 310, 400, 580, 230, 370],
          name: '製品B',
          marker: { color: '#f59e0b', size: 10 },
        },
      ]}
      layout={{ title: { text: '散布図' }, height: 300, margin: { t: 40, b: 40, l: 60, r: 20 } }}
      style={{ width: '100%' }}
      config={{ responsive: true }}
    />
  );
}

5. Apache ECharts (echarts-for-react)

JSONベースの設定で直感的に散布図を実装。軸ラベルや凡例のカスタマイズが豊富。

✓ 高カスタマイズ性✓ 軸ラベル対応✓ JSONベース設定

チャートを読み込み中...

特徴: JSONベースのオプション設定で軸ラベルや凡例を柔軟にカスタマイズ可能。 SSRには非対応のためdynamic importが必要。
tsx
'use client';
import dynamic from 'next/dynamic';
const ReactECharts = dynamic(() => import('echarts-for-react'), { ssr: false });

export function EChartsScatterChart() {
  const option = {
    tooltip: { trigger: 'item' },
    legend: { data: ['製品A', '製品B'], top: 'top' },
    xAxis: { type: 'value', name: '広告費(万円)' },
    yAxis: { type: 'value', name: '売上(万円)' },
    series: [
      {
        name: '製品A',
        type: 'scatter',
        data: [[120,340],[200,480],[150,390],[280,620],[320,710],[180,420],[250,560],[350,780],[100,290],[220,510]],
      },
      {
        name: '製品B',
        type: 'scatter',
        data: [[100,210],[180,350],[140,280],[260,440],[300,520],[160,310],[230,400],[340,580],[110,230],[200,370]],
      },
    ],
  };
  return <ReactECharts option={option} style={{ height: 300 }} />;
}

6. ApexCharts (react-apexcharts)

ズーム・パン機能を標準装備した散布図。複数系列の色分けと tooltip が直感的に設定可能

✓ ズーム・パン✓ 複数系列✓ アニメーション

チャートを読み込み中...

特徴: ズーム・パン機能が標準装備されており、大量のデータポイントを持つ散布図でも インタラクティブに探索できる。系列データは [x, y] 配列形式で簡潔に記述可能。
tsx
'use client';
import dynamic from 'next/dynamic';
const Chart = dynamic(() => import('react-apexcharts'), { ssr: false });

export function ApexScatterChart() {
  const options = {
    chart: { type: 'scatter' as const, toolbar: { show: false }, zoom: { enabled: true } },
    xaxis: { tickAmount: 6, labels: { formatter: (val: string) => parseFloat(val).toFixed(0) } },
    yaxis: { tickAmount: 5 },
    colors: ['#3b82f6', '#10b981'],
    dataLabels: { enabled: false },
    tooltip: { x: { show: true } },
  };
  const series = [
    { name: 'グループA', data: [[10, 30], [40, 100], [60, 50], [80, 120], [100, 80], [120, 150]] },
    { name: 'グループB', data: [[20, 60], [50, 90], [70, 40], [90, 110], [110, 70], [130, 130]] },
  ];
  return <Chart type="scatter" options={options} series={series} height={300} width="100%" />;
}

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

React + Tailwind CSSで、ApexCharts(react-apexcharts)を使った散布図を実装してください。

- 使用ライブラリ: react-apexcharts(dynamic importでSSR無効化)
- chart.type: 'scatter' を指定し、chart.toolbar: { show: false } でツールバーを非表示にすること
- サンプルデータ: グループA・Bの [x, y] 配列形式で各6件のデータを用意すること
- chart.zoom: { enabled: true } でズーム機能を有効にすること
- colors で各グループの色を指定すること
- dataLabels: { enabled: false } でデータラベルを非表示にすること

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

ライブラリ比較

ライブラリバブル拡張インタラクション大量データおすすめ用途
Recharts◎(ZAxis)ダッシュボード
Nivo◯(nodeSize)分析レポート
Chart.js◯(pointRadius)大量データの可視化
Plotly.js◎(marker.size)科学データ・統計分析
Apache ECharts◎(symbolSize)エンタープライズダッシュボード
ApexCharts◯(bubble typeへ切替)◎(ズーム・パン)ダッシュボード・業務アプリ

散布図の選択ポイント

  • Recharts: ZAxisを活用したバブルチャートへの拡張が容易。 Reactプロジェクトでのダッシュボード構築に最適。
  • Nivo: 美しいデフォルトデザインとメッシュベースのインタラクションが魅力。 分析レポートやプレゼンテーション向け。
  • Chart.js: Canvas描画で数千ポイントでも高パフォーマンス。 大量のデータポイントを扱う科学データやログ分析に最適。
  • Plotly.js: ズーム・パン・ホバーなどのインタラクティブ機能が標準装備。科学系・統計系グラフに特に強く、3Dグラフへの拡張も可能。
  • Apache ECharts: カスタマイズ性が非常に高く、ダッシュボード構築に適している。JSONベースのオプション設定で複雑な設定も直感的に記述できる。
  • ApexCharts:ズーム・パン機能が標準装備。[x, y] 配列形式でデータを記述でき、 type を 'bubble' に変更するだけでバブルチャートへ拡張できる。

散布図の典型的な使用例

📊 相関分析

広告費と売上、学習時間とテスト結果など2つの変数の関係を視覚化

🔬 科学データ

実験データのプロットや測定値の分布パターンの確認

👥 クラスタリング

顧客セグメントやデータのグループ分けを視覚的に表現

📈 外れ値検出

データの異常値やパターンから外れたポイントを発見

⚠️ 散布図使用時の注意点

  • データポイントが重なる場合は透明度を調整して視認性を確保する
  • 相関関係があっても因果関係があるとは限らないことに注意
  • 軸のスケールによって印象が大きく変わるため適切な範囲を設定する
  • 系列が多すぎると識別が困難になるため色の使い分けを工夫する

散布図(スキャッターチャート)は、2変数の相関関係をX軸・Y軸の座標点で表現するグラフ。データの分布やクラスタリングを把握できる。

身長と体重の相関・広告費と売上の関係・機械学習の予測と実績の比較など、2変数間の相関や外れ値を探索する場面で使われる。

主なバリエーション
  • 基本型(単一系列)
  • 複数系列型(色分け)
  • バブルスキャッター型(サイズ変動)
  • 回帰線付き型
  • インタラクティブ型(クリック詳細)

📊 使用しているサンプルデータ(クリックで表示)

2つの製品の広告費と売上の関係を示すデータ(各10件)を使用しています。

関連する逆引きリファレンス