ネットワークグラフライブラリ比較

3つのアプローチでノード間の関係性を可視化し、実装方法とスタイルを比較

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

社内の部門間コミュニケーション頻度を表すネットワークデータを使用しています。 ノードとリンクの2つの配列で構成し、リンクには接続の強さ(value)を持たせています。 グループは management・sales・tech の3種類で色分けしています。

{
  "nodes": [
    {
      "id": "経営企画",
      "group": "management",
      "size": 20
    },
    {
      "id": "営業",
      "group": "sales",
      "size": 18
    },
    {
      "id": "マーケティング",
      "group": "sales",
      "size": 15
    },
    {
      "id": "開発",
      "group": "tech",
      "size": 22
    },
    {
      "id": "デザイン",
      "group": "tech",
      "size": 14
    },
    {
      "id": "カスタマーサクセス",
      "group": "sales",
      "size": 13
    },
    {
      "id": "人事",
      "group": "management",
      "size": 12
    },
    {
      "id": "経理",
      "group": "management",
      "size": 11
    }
  ],
  "links": [
    {
      "source": "経営企画",
      "target": "営業",
      "value": 8
    },
    {
      "source": "経営企画",
      "target": "開発",
      "value": 7
    },
    {
      "source": "経営企画",
      "target": "人事",
      "value": 9
    },
    {
      "source": "経営企画",
      "target": "経理",
      "value": 8
    },
    {
      "source": "営業",
      "target": "マーケティング",
      "value": 9
    },
    {
      "source": "営業",
      "target": "カスタマーサクセス",
      "value": 7
    },
    {
      "source": "営業",
      "target": "開発",
      "value": 5
    },
    {
      "source": "マーケティング",
      "target": "デザイン",
      "value": 8
    },
    {
      "source": "開発",
      "target": "デザイン",
      "value": 9
    },
    {
      "source": "開発",
      "target": "カスタマーサクセス",
      "value": 6
    },
    {
      "source": "人事",
      "target": "経理",
      "value": 7
    }
  ]
}

1. Nivo(@nivo/network)

@nivo/networkパッケージでネットワークグラフをネイティブサポート。ノードとリンクを渡すだけでフォースシミュレーションによる自動レイアウトを実現。 repulsivity・linkDistanceなどのパラメータでノードの配置を調整可能。ホバー時のハイライトやツールチップも標準搭載。

✓ 専用パッケージ✓ 美しいデザイン✓ フォース自動計算
特徴: @nivo/networkが最もバランスが良く、導入コストを抑えつつ高品質な表示を実現。 ノードにカーソルを当てるとハイライトとツールチップが表示される。
tsx
'use client';
import { ResponsiveNetwork } from '@nivo/network';

const data = {
  nodes: [
    { id: 'A', radius: 12, color: '#3b82f6' },
    { id: 'B', radius: 10, color: '#10b981' },
    { id: 'C', radius: 10, color: '#10b981' },
    { id: 'D', radius: 8, color: '#8b5cf6' },
    { id: 'E', radius: 8, color: '#8b5cf6' },
    { id: 'F', radius: 8, color: '#f97316' },
  ],
  links: [
    { source: 'A', target: 'B', distance: 80 },
    { source: 'A', target: 'C', distance: 80 },
    { source: 'B', target: 'D', distance: 60 },
    { source: 'B', target: 'E', distance: 60 },
    { source: 'C', target: 'F', distance: 60 },
  ],
};

export function NivoNetworkGraph() {
  return (
    <div style={{ height: 300 }}>
      <ResponsiveNetwork
        data={data}
        margin={{ top: 0, right: 0, bottom: 0, left: 0 }}
        linkDistance={(e) => (e as any).distance}
        centeringStrength={0.3}
        repulsivity={6}
        nodeColor={(n) => (n as any).color}
        nodeBorderWidth={1}
        nodeBorderColor={{ from: 'color', modifiers: [['darker', 0.8]] }}
        linkThickness={(n) => 2}
        linkBlendMode="multiply"
        motionConfig="wobbly"
      />
    </div>
  );
}

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

React + Tailwind CSSで、Nivo(@nivo/network)を使ったネットワークグラフを実装してください。

- 使用ライブラリ: @nivo/network の ResponsiveNetwork コンポーネント
- サンプルデータ: 社内部門間のコミュニケーション頻度(nodes・links配列)を用意すること
- インタラクティブ: ホバー時にノードのハイライトとツールチップを表示すること(標準搭載)
- レイアウト: repulsivity・linkDistance パラメータでフォースシミュレーションによる自動配置を調整すること
- レスポンシブ: ResponsiveNetwork を使って親要素の幅に応じてサイズが変わるよう対応すること
- スタイリング: nodeColor でグループ別に色分けし、ノードサイズを size プロパティで設定すること

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

2. D3.js(カスタム実装)

d3-forceによるフォースシミュレーションとSVG描画をReactで制御するカスタム実装。 ノードのドラッグ操作・クリックによる詳細表示・ズーム操作など高度なインタラクションを実装可能。 forceの種類(charge・link・center・collision)を細かくチューニングでき、大規模ネットワークの可視化にも対応。

✓ 完全カスタマイズ✓ d3-force✓ ドラッグ操作対応
特徴: ノードをドラッグして配置を変更できる。クリックで選択状態になり詳細情報を表示。 forceのパラメータを直接制御できるため、表現力は最大。
tsx
'use client';
import { useEffect, useRef } from 'react';
import * as d3 from 'd3';

const nodes = [
  { id: 'A', r: 12 }, { id: 'B', r: 10 }, { id: 'C', r: 10 },
  { id: 'D', r: 8 }, { id: 'E', r: 8 }, { id: 'F', r: 8 },
];
const links = [
  { source: 'A', target: 'B' }, { source: 'A', target: 'C' },
  { source: 'B', target: 'D' }, { source: 'B', target: 'E' },
  { source: 'C', target: 'F' },
];

export function D3NetworkGraph() {
  const svgRef = useRef<SVGSVGElement>(null);

  useEffect(() => {
    const svg = d3.select(svgRef.current);
    const { width, height } = svgRef.current!.getBoundingClientRect();

    const simulation = d3.forceSimulation(nodes as any)
      .force('link', d3.forceLink(links as any).id((d: any) => d.id).distance(80))
      .force('charge', d3.forceManyBody().strength(-200))
      .force('center', d3.forceCenter(width / 2, height / 2));

    const link = svg.append('g').selectAll('line').data(links).enter().append('line')
      .attr('stroke', '#d1d5db').attr('stroke-width', 2);

    const node = svg.append('g').selectAll('circle').data(nodes).enter().append('circle')
      .attr('r', (d) => d.r).attr('fill', '#3b82f6').attr('stroke', '#fff').attr('stroke-width', 2)
      .call(d3.drag<any, any>()
        .on('start', (e, d) => { if (!e.active) simulation.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; })
        .on('drag', (e, d) => { d.fx = e.x; d.fy = e.y; })
        .on('end', (e, d) => { if (!e.active) simulation.alphaTarget(0); d.fx = null; d.fy = null; })
      );

    simulation.on('tick', () => {
      link.attr('x1', (d: any) => d.source.x).attr('y1', (d: any) => d.source.y)
          .attr('x2', (d: any) => d.target.x).attr('y2', (d: any) => d.target.y);
      node.attr('cx', (d: any) => d.x).attr('cy', (d: any) => d.y);
    });

    return () => { simulation.stop(); svg.selectAll('*').remove(); };
  }, []);

  return <svg ref={svgRef} style={{ width: '100%', height: 300 }} />;
}

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

React + Tailwind CSSで、D3.js(カスタム実装)を使ったネットワークグラフを実装してください。

- 使用ライブラリ: d3-force の forceSimulation・forceManyBody・forceLink・forceCenter・forceCollide を使ったフォースシミュレーション + SVG描画をReactで制御するカスタム実装
- サンプルデータ: 社内部門間のコミュニケーション頻度(nodes・links配列)を用意すること
- インタラクティブ: ノードのドラッグ移動とクリックによる選択・詳細情報表示を実装すること
- レイアウト: charge・link・center・collision の各forceパラメータを細かくチューニングすること
- レスポンシブ: viewBox を使って親要素の幅に応じてサイズが変わるよう対応すること
- スタイリング: ノードのサイズをコネクション数に応じて変化させ、グループ別に色分けすること

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

3. react-force-graph

react-force-graphはネットワークグラフに特化した軽量ライブラリ。ForceGraph2Dコンポーネントにnodesとlinksを渡すだけで即座にインタラクティブなネットワークグラフを描画。 Canvas/WebGLを使用するため数千ノードでも高いパフォーマンスを発揮。3D表示(ForceGraph3D)への切り替えも容易。

✓ 2D/3D対応✓ 高パフォーマンス✓ シンプルAPI
特徴: Canvas描画のためパフォーマンスが高く、インタラクティブな操作(ドラッグ・ズーム)が標準搭載。 ノードにカーソルを当てるとラベルのツールチップが表示される。
tsx
'use client';
import dynamic from 'next/dynamic';

const ForceGraph2D = dynamic(() => import('react-force-graph').then(m => m.ForceGraph2D), { ssr: false });

const data = {
  nodes: [
    { id: 'A', group: 1 }, { id: 'B', group: 2 }, { id: 'C', group: 2 },
    { id: 'D', group: 3 }, { id: 'E', group: 3 }, { id: 'F', group: 3 },
  ],
  links: [
    { source: 'A', target: 'B' }, { source: 'A', target: 'C' },
    { source: 'B', target: 'D' }, { source: 'B', target: 'E' },
    { source: 'C', target: 'F' },
  ],
};

const colors = ['', '#3b82f6', '#10b981', '#8b5cf6'];

export function ForceGraphNetwork() {
  return (
    <ForceGraph2D
      graphData={data}
      width={400}
      height={300}
      nodeColor={(n: any) => colors[n.group]}
      nodeRelSize={6}
      linkColor={() => '#d1d5db'}
    />
  );
}

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

React + Tailwind CSSで、react-force-graph を使ったネットワークグラフを実装してください。

- 使用ライブラリ: react-force-graph の ForceGraph2D コンポーネント
- サンプルデータ: 社内部門間のコミュニケーション頻度(nodes・links配列)を用意すること
- インタラクティブ: ドラッグ・ズームが標準搭載。ノードにカーソルを当てるとラベルのツールチップを表示すること
- レイアウト: ForceGraph2D にデータを渡すだけでフォース指向レイアウトが自動適用されること
- レスポンシブ: width・height プロパティで表示サイズを制御すること
- スタイリング: nodeColor・nodeVal でノードの色とサイズをコネクション数に応じて設定し、Canvas/WebGL描画で高パフォーマンスを実現すること

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

ライブラリ比較

アプローチレンダリング対応状況大規模グラフおすすめ用途
NivoSVG◎ 専用パッケージデザイン重視のダッシュボード
D3.js カスタムSVG◎ 完全カスタム高度なインタラクション
react-force-graphCanvas/WebGL◎ 専用ライブラリ大規模ネットワーク・3D表示

選択のポイント

  • Nivo: @nivo/networkが最もバランスが良く、導入コストを抑えつつ高品質な表示を実現。 小〜中規模のネットワーク可視化に最適。
  • D3.js: ドラッグ・ズーム・クリックなど高度なインタラクションが必要な分析ツールに選択。 実装コストは高いが表現力は最大。
  • react-force-graph: 数百〜数千ノードの大規模グラフや3D表示が必要な場合に選択。 Canvas/WebGL描画で圧倒的なパフォーマンスを発揮。

典型的な使用例

  • 👥組織・コミュニティ分析:部門間・人物間のコミュニケーション頻度や関係性を可視化
  • 🌐Webサイト構造:ページ間のリンク関係やサイト構造をネットワークで表現
  • 🔗知識グラフ:概念・用語間の関連性を可視化するナレッジベース
  • 📦依存関係マップ:ソフトウェアのモジュール・パッケージ間の依存関係を表示

⚠️ 使用時の注意点

  • ノード数が増えるほど視認性が低下するため、重要なノード・リンクのみ表示するフィルタリング機能の実装を検討する
  • フォースシミュレーションは初期表示時にアニメーションが発生するため、SSR環境での動作確認が必要
  • ノードのラベルはズームレベルに応じて表示・非表示を切り替えると見やすくなる
  • 孤立したノード(リンクのないノード)の扱いを事前に設計しておく