Takuyaです。
今回はオープンチャットネタです。
LINE オープンチャットの Python 部屋に、
NetworkX というパッケージを使ってグラフを描画したいんだけど、うまくいきません。。。
というような投稿がありました。
この投稿で NetworkX というパッケージを知ったのですが、比較的簡単に使えたので、ご紹介します。
目次
NetworkX とは
NetworkX は Python のパッケージの1つです。
公式サイトはこちら。(たぶん)
公式サイトには、
NetworkX is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks.
https://networkx.github.io/
とあります。
Google 先生に翻訳してもらうと、
NetworkXは、複雑なネットワークの構造、ダイナミクス、および機能の作成、操作、および研究のためのPythonパッケージです。
ということで、何やらよくわかりません。
少し調べると、情報処理試験で出てくる PERT 図のような ノードとノード同士をつなぐ辺で構成されたネットワーク図が簡単に描けるようです。
図を描くだけではなく、ネットワーク分析、グラフ分析などができるパッケージのようですが、今回は NetworkX を使って、上記のような図を描画する方法をご紹介します。
確認環境
今回も Google Colab で確認しました。
便利ですよね。
必要なパッケージをインストール
Google Colab の場合はインストールは不要です。
ローカル環境で実施される方は pip で NetworkX と Matplotlib をインストールしてください。
図の表示に Matplotlib というライブラリを使います。
pip install networkx
pip install matplotlib
NetworkX でネットワーク図を描いてみよう
では早速、NetworkX を使用して、いくつか図を描いてみましょう。
ノードのみの図
まずはシンプルにノードだけを追加した図です。
上記の図を描くコード
import matplotlib.pyplot as plt
import networkx as nx
g = nx.Graph()
g.add_nodes_from(['A', 'B', 'C', 'D', 'E'])
nx.draw_networkx(g)
plt.show()
インスタンスを作る → ノードを追加する → グラフを準備する → グラフを表示する という流れでしょうか。
この図を元に色々といじってみたいと思います。
ノードとノードをつなぐ辺(edge)を追加
ノードのみの図に、ノードとノードをつなぐ辺を追加して、ネットワーク図っぽくします。この辺のことを edge と呼ぶそうです。
上記の図を描くコード
import matplotlib.pyplot as plt
import networkx as nx
g = nx.Graph()
g.add_nodes_from(['A', 'B', 'C', 'D', 'E'])
g.add_edges_from([
('A', 'B'),
('A', 'C'),
('A', 'D'),
('A', 'E'),
('B', 'C'),
('B', 'D'),
('B', 'E'),
('C', 'D'),
('C', 'E'),
('D', 'E')
])
nx.draw_networkx(g)
plt.show()
g.add_edges_from()
を追加しています。
全てのノード同士をつなぐようにしてみました。
edge を追加するとノードの位置が変わってしまうんですね。
さらに、描画するたびに位置が変わってしまうという。。。
ノードに位置情報を与える
edge を追加した図は描画するたびにノードの位置が変わってしまうので、ノードに位置情報を与えます。
ノードに位置情報を与えることで、毎回同じ図が描かれるようになります。
上記の図を描くコード
import matplotlib.pyplot as plt
import networkx as nx
g = nx.DiGraph()
g.add_nodes_from(['A', 'B', 'C', 'D', 'E'])
g.add_edges_from([
('A', 'B'),
('A', 'C'),
('A', 'D'),
('A', 'E'),
('B', 'C'),
('B', 'D'),
('B', 'E'),
('C', 'D'),
('C', 'E'),
('D', 'E')
])
pos = {
'A': (0, 0),
'B': (5, 5),
'C': (5, -5),
'D': (-5, -5),
'E': (-5, 5)
}
nx.draw_networkx(g, pos)
plt.show()
位置情報は辞書の形式で指定しています。
辞書のキーにノード名、値にタプル形式でxyの座標を指定します。
また、nx.draw_networkx()
に位置情報を設定しています。
edge に方向を持たせる
最後に edge に方向を持たせてみます。
上記の図を描くコード
import matplotlib.pyplot as plt
import networkx as nx
g = nx.DiGraph()
g.add_nodes_from(['A', 'B', 'C', 'D', 'E'])
g.add_edges_from([
('A', 'B'),
('A', 'C'),
('A', 'D'),
('A', 'E'),
('B', 'C'),
('B', 'D'),
('B', 'E'),
('C', 'D'),
('C', 'E'),
('D', 'E')
])
pos = {
'A': (0, 0),
'B': (5, 5),
'C': (5, -5),
'D': (-5, -5),
'E': (-5, 5)
}
nx.draw_networkx(g, pos)
plt.show()
これは簡単です。
Graph()
をDiGraph()
に変更しました。おそらく、direction の「Di」だと思います。
方向はadd_edges_from()
で edge を追加した時のノード名の順番で決まります。
まとめ
今回は、
NetworkX というパッケージを使ってネットワーク図を描く方法
をご紹介しました。
以上です。
コメント