力学モデルによるグラフレイアウト
力学モデルによるグラフレイアウトとは
力学モデルによるグラフレイアウト(force-directed graph drawing)は、ノードとエッジの集合に物理シミュレーションを適用して、自然に見える配置を自動計算する手法です。人手で座標を決めなくても、繋がりの強いノード同士は近く、そうでないノードは離れて配置されます。
ノードに「電荷」を、エッジに「バネ」を見立てるのが基本の発想です。全ノードが互いに反発しつつ、繋がったノード同士はバネで引き合う — この綱引きが釣り合う位置に落ち着くまで、毎フレーム少しずつ座標を更新していきます。
主な力
| 力 | 働き |
|---|---|
| 反発力 | 全ノードのペアに働く。近いほど強く押し合い、重なりを防ぐ |
| 引力(バネ力) | エッジで繋がったノード同士を一定の距離に保とうとする |
| 中心力 | 画面中央へ弱く引き寄せる。全体が画面外へ拡散するのを防ぐ |
シミュレーションの収束
各ティック(1フレーム分の更新)で座標を少しずつ動かしますが、永遠に動かし続けると重くなります。そこでalphaと呼ばれる「温度」のような値を用意し、ティックのたびに少しずつ減衰させます。alphaが閾値を下回ったらシミュレーションを停止し、レイアウトを確定させます。
この仕組みがないと、ノード数が多い・力の設定が不安定な場合に無限ループ状態になりかねません。上限ティック数を設けて強制的に打ち切る実装も、安全策として一般的です。
初学者向けポイント
- 発想は「バネと磁石でできた模型を揺らして静止するのを待つ」イメージに近い
- ノード数が多いと反発力の計算量は素朴な実装だとO(n²)になり、ノード増加に弱い(大規模グラフでは近似アルゴリズムで高速化する)
- 座標を人手で決めなくてよいため、知識の相関図・組織図・ネットワーク構成図のように「繋がり」を可視化したいデータと相性がよい
prefers-reduced-motionなどアニメーション抑制設定の利用者向けには、アニメーションさせず一気に収束後の座標だけを表示する配慮も必要
関連技術とのつながり
- [[SVGとCanvas]] — シミュレーションで求めた座標を実際に画面へ描く手段
- [[グラフデータベース]] — こちらは「データの持ち方」の話で、力学モデルは「見せ方」の話。レイヤーが異なる
- [[Webパフォーマンス最適化]] — ノード数増加時はシミュレーションの計算コストがボトルネックになりやすい
- [[状態管理]] — 毎ティックの座標はUIと同期させる「状態」として扱う
Q: 力学モデルによるグラフレイアウトで、繋がったノード同士を近づける力はどれ?
- [ ] 反発力
- [x] 引力(バネ力)
- [ ] 中心力
解説: エッジで繋がったノード同士を一定距離に保とうとするのが引力(バネ力)です。反発力は逆に全ノードを押し合わせます。
Q: シミュレーションを安全に停止させるために使う値は何?
- [ ] エッジの本数
- [x] alpha(温度に相当する減衰値)
- [ ] ノードのcolor
解説: alphaはティックごとに減衰し、閾値を下回るとシミュレーションを停止します。これが無いと無限に計算し続けかねません。
Q: 力学モデルによるグラフレイアウトが向いているデータはどれ?
- [x] ノード同士の繋がり(関係性)を可視化したいデータ
- [ ] 時系列で変化する数値の推移
- [ ] 単純な棒グラフで十分な集計値
解説: 力学モデルはノード間の関係性を、座標を手作業で決めずに自然な配置として可視化するのに適しています。