ネットワークグラフライブラリ比較
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などのパラメータでノードの配置を調整可能。ホバー時のハイライトやツールチップも標準搭載。
'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)を細かくチューニングでき、大規模ネットワークの可視化にも対応。
'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)への切り替えも容易。
'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の回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
ライブラリ比較
| アプローチ | レンダリング | 対応状況 | 大規模グラフ | おすすめ用途 |
|---|---|---|---|---|
| Nivo | SVG | ◎ 専用パッケージ | △ | デザイン重視のダッシュボード |
| D3.js カスタム | SVG | ◎ 完全カスタム | ◯ | 高度なインタラクション |
| react-force-graph | Canvas/WebGL | ◎ 専用ライブラリ | ◎ | 大規模ネットワーク・3D表示 |
選択のポイント
- •Nivo: @nivo/networkが最もバランスが良く、導入コストを抑えつつ高品質な表示を実現。 小〜中規模のネットワーク可視化に最適。
- •D3.js: ドラッグ・ズーム・クリックなど高度なインタラクションが必要な分析ツールに選択。 実装コストは高いが表現力は最大。
- •react-force-graph: 数百〜数千ノードの大規模グラフや3D表示が必要な場合に選択。 Canvas/WebGL描画で圧倒的なパフォーマンスを発揮。
典型的な使用例
- 👥組織・コミュニティ分析:部門間・人物間のコミュニケーション頻度や関係性を可視化
- 🌐Webサイト構造:ページ間のリンク関係やサイト構造をネットワークで表現
- 🔗知識グラフ:概念・用語間の関連性を可視化するナレッジベース
- 📦依存関係マップ:ソフトウェアのモジュール・パッケージ間の依存関係を表示
⚠️ 使用時の注意点
- •ノード数が増えるほど視認性が低下するため、重要なノード・リンクのみ表示するフィルタリング機能の実装を検討する
- •フォースシミュレーションは初期表示時にアニメーションが発生するため、SSR環境での動作確認が必要
- •ノードのラベルはズームレベルに応じて表示・非表示を切り替えると見やすくなる
- •孤立したノード(リンクのないノード)の扱いを事前に設計しておく