Python

【Python】NetworkxによるネットワークグラフをGifアニメーションで解説|networkx.spring_layout()のk値について

Python

はじめに

pythonでネットワークグラフを描くために、networkxというライブラリがあります。

ネットワークグラフとは、このようなグラフです。

例えば、一つ一つの丸(ノード)を人間にして、人と人の繋がりを表現したりするのに使用します。

この記事のゴール

  • networkxによるネットワークグラフの基本的な使い方が理解すること
  • networkx.spring_layout()のk値をgifアニメーションで直感的に理解する

ノードの作り方

#ノードの作り方
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1, 2)
  • 丸(ノード)を作るには、G.add_node()で作ることができます
  • ノードとノードをつなげるエッジは、G.add_edge(,)でつなげることができます

任意の属性(attribute)のつけ方

各ノードには、任意の属性(attribute)を持たせることができます。

例えば、nameidというattributeを持たせる場合は以下のように記述します。

G.nodes[1]["id"] = "1"

Networkxによるノード位置の自動決定

Networkxの便利な機能の一つに、ノード位置の自動決定というものがあります。

例えば、ノードが多くなると配置を考えるのが大変ですよね。Networkxであれば、その悩みを解決できます。

Networkxでlayoutを自動決定するアルゴリズムの詳細は、Graph Layoutに記載されています。

そこで、今回は実際によく使われるspring layoutというのを使ってみます。

import numpy as np
import networkx as nx

node_num = 20

num = []
for x in np.linspace(0.0, 2, 200):
    num.append(x)

G = nx.Graph()
for i in range(node_num):
    G.add_node(i)
    
for i in range(len(G)):
    for j in range(i,i+3):
        G.add_edge(i,j)
        
n = 1
for i in num:
    pos = nx.spring_layout(G, k=i, seed=20)
    #nx.draw(G,pos)
    nx.draw_networkx_nodes(G, pos, node_color='B',alpha=0.1)
    nx.draw_networkx_edges(G, pos, alpha=0.4, edge_color='C')
    plt.title("k="+str(np.round(i,2)))
    plt.savefig('img/{0:04d}+.png'.format(n))
    plt.show()
    n = n+1

実行するときは、カレントディレクトリにimgというフォルダを作成して実行してくださいね。

作成されたpngから、gifアニメーションを作った結果がこちらです。

spring_layout(G, k=, seed=20)のkの値が大きくなるほどノードの分散性が高くなっていることがわかります。

seedの値は、ランダムシードの値なので、任意の数字でOKです。乱数を固定したいときに使用します。

まとめ

NetworkxによるネットワークグラフをGifアニメーションで解説しました。

  • 丸(ノード)を作るには、G.add_node()で作ることができます
  • ノードとノードをつなげるエッジは、G.add_edge(,)でつなげることができます
  • spring_layout()で自動でノードを配置することができます

もっとpythonを学びたいという方は、こちらの記事も参考にしてみてください。

今回の記事は、以上です。

最後までお読み頂きありがとうございました。

コメント

タイトルとURLをコピーしました