いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【Python】ネットワークグラフを描きたい

・お題:いろいろなモノの関係を視覚的に表現したグラフに、ネットワークグラフというのがあるみたい。なんだかカッコいいので、作ってみたい。

 

・networkxというライブラリを使った。正しいことは公式サイトを参照していただきたい。インストールは割愛。

networkx.org

・ネットワークグラフというのは、ノードといわれる丸印をエッジと呼ばれる線でつないだグラフのことらしい。まずは、ノードをネットワークに加え、図示してみた。

import matplotlib.pyplot as plt

import networkx as nx
G = nx.Graph()
G.add_nodes_from(["A","B","C","D","E"])
nx.draw(G, with_labels = True)

・ノードの名前が書かれた丸印が打たれた。ちなみに、図示するたびに場所が変わる。ちなみに、G.remove_node("E")するとEのノードを除去することができる。

G.remove_node("E")
nx.draw(G, with_labels = True)

・次に、エッジを追加する。タプルかリストで2つのノードを並べてやれば、それぞれが関係していること、エッジでつながっていることになるみたい。渡すときは2つのノードを並べたタプルのリストを渡す。

G.add_edges_from([("A","B"),("B","C"),("B","D"),("C","D")])

nx.draw(G, with_labels = True)

ちなみに、やはりGraph.remove_edge() でエッジを除くことができる(図は割愛)。

・グラフから、情報を出すこともできる。

nx.info(G)

'Graph with 4 nodes and 4 edges'

G.nodes()

NodeView( ( 'A',  'B', 'C', 'D' ) )

G.edges()

EdgeView([('A', 'B'), ('B', 'C'), ('B', 'D'), ('C', 'D')])

・どのノードから何本のエッジが伸びているか(degree)もわかる。

nx.degree(G)

DegreeView({'A': 1, 'B': 3, 'C': 2, 'D': 2})という感じで、辞書っぽく返ってくるので、nx.degree(G)["A"]などすれば、指定のノードのdegreeを得ることもできる。

・せっかくなので、ノードのサイズと色をdegreeによって変えてみた。まずはライブラリをインポートして、グラフの要素を設定。

import networkx as nx
import matplotlib.pyplot as plt
from sklearn.preprocessing import minmax_scale
G2 = nx.Graph()
G2.add_nodes_from(["A","B","C","D","E","F","G"])
G2.add_edges_from([("A","B"),("B","C"),("C","D"),("D","E"),("E","F"),("F","G"),("A","C"),("A","D"),("A","E"),("A","F"),("A","G"),("B","D"),("B","F"),("C","E"),("C","G"),("D","G"),("C","F")])

・次に、ノードの大きさと色を設定し、描画。カラーマップをpltから持ってくれば、node_color引数に数値のリストを投げてノードの色を設定できる。

sizes = [n*100 for n in list(dict(nx.degree(G2)).values())]
colors=minmax_scale(list(dict(nx.degree(G2)).values()))
nx.draw(G2, with_labels=True, node_size = sizes, node_color=colors, cmap=plt.cm.cool)

・いかにもAとCが大切っぽい見た目になった。

・よく見ると、Aからエッジが6本、Cからエッジが5本のびているように見えるが、色と大きさが同じになった。BACが一直線に並んでおり、CAとCBが重なっているっぽい。少し工夫が必要と思った。

 

 

おわり