D3.js v4/v5 force simulation リンク作用力 – サンプル

2018-02-03

D3.jsのforceSimulation(旧force layout)のプログラムデモです(v4/v5対応)。リンクによる相互作用を説明します。ノード間の相互作用についてはこちらを参照ください。

ノード(丸いやつ)をドラッグしてください

サンプルコード

解説

1. 描画用のデータ準備

document.querySelector( )でsvgの幅と高さを取得します。

リンクをつなぐノードのIDは、任意のkey名を指定することができます。今回はindexをノード用データ配列に格納して後で指定します。数字でなく文字列でもID指定できます。

リンク用配列データlinksData の作成です。今回はリンクの長さをリンクごとに変えたいので l を定義しておきます。

2. svg要素を配置

リンクとノードのsvg要素を配置していきます。call( )でドラッグ時のイベント関数を登録しています。

3. forceSimulation設定

forceSimulationで設定できるリンクによる相互作用(ハイライト部分)を解説します。

ノード間の相互作用については、こちらを参照ください。

“link” : リンクによる相互作用

distance リンクの長さを設定します。リンクは常に設定された長さに戻ろうとします。いわゆる自由長です。デフォルトは30。
strength リンクの強度です。デフォルトは1 / Math.min(count(link.source)、count(link.target))。ひとつずつのノードとつながっている場合は1です。同じノード間に2つのリンクがあっても反力が同じになる仕様です。
iterations simulationの反復回数。反復回数を増やすと計算が安定しますが計算時間が増加します。デフォルトは1。

id( )でインデックスにするkey名を指定します。デフォルトはnode.indexです。

4. forceSimulation 描画更新用関数

シミュレーションのステップごとに呼び出される関数です。svg要素を動かすために計算結果をsvg要素の位置に反映します。

5. ドラッグ時のイベント関数

ドラッグ時のイベント関数です。こちらを参照ください。

まとめ

ここではリンクによる相互作用をまとめました。次に座標更新のアルゴリズムとシミュレーションの実行関数を紹介します。