リンクフォース
リンクフォースは、指定されたリンク距離に応じて、リンクされたノードを互いに引き寄せたり、離したりします。力の強さは、リンクされたノード間の距離と目標距離の差に比例し、バネ力に似ています。
forceLink(links)
ソース · 指定されたlinksとデフォルトパラメータで新しいリンクフォースを作成します。linksが指定されていない場合、デフォルトは空の配列になります。
警告
この関数は純粋ではありません。渡されたlinksをミューテートする可能性があります。link.linksを参照してください。
const link = d3.forceLink(links).id((d) => d.id);
link.links(links)
ソース · linksが指定されている場合は、このフォースに関連付けられたリンクの配列を設定し、各リンクの距離および強さパラメータを再計算して、このフォースを返します。linksが指定されていない場合は、現在のリンクの配列を返します。デフォルトは空の配列です。
各リンクは、次のプロパティを持つオブジェクトです。
source
- リンクのソースノード。simulation.nodesを参照してください。target
- リンクのターゲットノード。simulation.nodesを参照してください。index
- linksへのゼロベースのインデックス。このメソッドによって割り当てられます。
便宜上、リンクのsourceおよびtargetプロパティは、オブジェクト参照ではなく、数値または文字列の識別子を使用して初期化できます。link.idを参照してください。
警告
この関数は純粋ではありません。リンクフォースが初期化されたとき(または、ノードやリンクが変更されたときのように再初期化されたとき)、渡されたlinksをミューテートする可能性があります。オブジェクトではないlink.sourceまたはlink.targetプロパティは、指定された識別子を持つ対応するnodeへのオブジェクト参照に置き換えられます。
指定されたlinksの配列が、シミュレーションへのリンクの追加や削除などによって変更された場合、このメソッドは、変更をフォースに通知するために、新しい(または変更された)配列で再度呼び出す必要があります。フォースは、指定された配列の防御的コピーを作成しません。
link.id(id)
ソース · idが指定されている場合は、ノードIDアクセッサを指定された関数に設定して、このフォースを返します。idが指定されていない場合は、現在のノードIDアクセッサを返します。デフォルトは数値のnode.indexです。
function id(d) {
return d.index;
}
デフォルトのIDアクセッサを使用すると、各リンクのsourceおよびtargetを、nodes配列へのゼロベースのインデックスとして指定できます。例:
const nodes = [
{"id": "Alice"},
{"id": "Bob"},
{"id": "Carol"}
];
const links = [
{"source": 0, "target": 1}, // Alice → Bob
{"source": 1, "target": 2} // Bob → Carol
];
次に、文字列を返す別のIDアクセッサを検討します。
function id(d) {
return d.id;
}
このアクセッサを使用すると、名前付きのソースとターゲットを使用できます。
const nodes = [
{"id": "Alice"},
{"id": "Bob"},
{"id": "Carol"}
];
const links = [
{"source": "Alice", "target": "Bob"},
{"source": "Bob", "target": "Carol"}
];
これは、JSONが参照を許可しないため、JSONでグラフを表す場合に特に役立ちます。この例を参照してください。
IDアクセッサは、nodesまたはlinksの変更時など、フォースが初期化されるたびに、ノードとそのゼロベースのインデックスを渡して呼び出されます。
link.distance(distance)
ソース · distanceが指定されている場合は、距離アクセッサを指定された数値または関数に設定し、各リンクの距離アクセッサを再評価して、このフォースを返します。distanceが指定されていない場合は、現在の距離アクセッサを返します。デフォルトは
function distance() {
return 30;
}
距離アクセッサは、各linkに対して、linkとそのゼロベースのindexを渡して呼び出されます。結果の数値は内部的に格納され、各リンクの距離は、フォースが初期化されたとき、またはこのメソッドが新しいdistanceで呼び出されたときにのみ再計算され、フォースの適用ごとには再計算されません。
link.strength(strength)
ソース · strengthが指定されている場合は、強さアクセッサを指定された数値または関数に設定し、各リンクの強さアクセッサを再評価して、このフォースを返します。strengthが指定されていない場合は、現在の強さアクセッサを返します。デフォルトは
function strength(link) {
return 1 / Math.min(count(link.source), count(link.target));
}
ここで、count(node)は、指定されたノードをソースまたはターゲットとするリンクの数を返す関数です。このデフォルトが選択されたのは、接続数の多いノードに接続されたリンクの強さを自動的に弱め、安定性を向上させるためです。
強さアクセッサは、各linkに対して、linkとそのゼロベースのindexを渡して呼び出されます。結果の数値は内部的に格納され、各リンクの強さは、フォースが初期化されたとき、またはこのメソッドが新しいstrengthで呼び出されたときにのみ再計算され、フォースの適用ごとには再計算されません。
link.iterations(iterations)
ソース · iterationsが指定されている場合は、適用あたりの反復回数を指定された数値に設定して、このフォースを返します。iterationsが指定されていない場合は、現在の反復回数を返します。デフォルトは1です。反復回数を増やすと、制約の剛性が大幅に向上し、格子などの複雑な構造に役立ちますが、フォースを評価するためのランタイムコストも増加します。