グラフ理論におけるグラフは基本的にはトポロジが重要なので、ノードの座標情報については特に定義がありません。一方でグラフを描画するときは、ノードの座標情報がなければ描画時にそもそも筆をすすめることができなくなるため座標情報は必須です。
私はこの「ネットワーク自体には座標情報は存在しないけれど、描画をするために1つ1つのノード座標を考えなければならない」 という点でちょっとやりにくさを感じました。
けれど NetworkX は座標を自動生成する機能をしっかり備えてくれていたので、分かってしまえばなんてことはありませんでした。
座標情報を明示的に与えない場合
座標情報を考えずに NetworkX の draw 関数を使えばそれなりのグラフが表示されます。これはノードの座標を NetworkX 側で自動的に決めているから のようです。
この描画時の座標を決めるアルゴリズムは実は奥の深い世界のようでして、グラフ(ネットワーク)をきれいに描画するアルゴリズム というブログ記事では
- グラフをきれいに描画する方法については昔から研究がされている
- 主なモデルの 1 つは力学モデルであり、 Fruchterman-Reingold アルゴリズムが有名
- NetworkX はデフォルトでこのアルゴリズムを使う(spring_layout という名前で実装されている)
ということが説明されています。
座標情報を明示的に与える場合
NetworkX に限った話ですが、NetworkX のメソッドの関係上
- ノードのみの描画 (draw_networkx_nodes)
- エッジのみの描画 (draw_networkx_edges)
- ノードのラベルの描画 (draw_networkx_labels)
- エッジのラベルの描画 (draw_networkx_edge_labels)
は第二引数に必ず座標情報 (pos) を与えなければなりません。またそれ以外の場合でも、先程の spring_layout 以外のレイアウトをする場合は明示的に座標情報を与える必要があります。
これに私は最初躓いたのですが、どうやら NetworkX は 自動生成した座標情報を pos の形で返してくれるメソッドを持っている みたいでした。これを使うことで、座標情報を明示的に示す場合や、明示的に示さなければならない場合であっても、自動生成した座標情報が使えるみたいです。
メソッドは公式リファレンスの Drawing の章 に一覧があり
- bipartite_layout
- circular_layout
- kamada_kawai_layout
- random_layout
- rescale_layout
- shell_layout
- spring_layout
- spectral_layout
が利用できるそうです。
Be First to Comment