・お題:どのノードからどのノードにエッジが伸びているかと、そのエッジのウェイトが入っている表(エッジリスト)を入手した。ここから、ネットワーク図を描いてみたい。
・neoworkxを利用した。
・まずはエッジリストを適当に作成する。
import pandas as pd
df=pd.DataFrame({"from":["A","A","A","B"],
"to":["B","C","D","C"],
"weight":[4,2,0.5,1]})
・次に、ネットワークに読み込む。エッジリストでは適当にfromとtoなどと命名したが、それぞれsouceとtargetが正式名称らしい。edge_attrはそれぞれのエッジに指定できる属性のようなものらしく、今回はweightをそのまま太さとして利用する。
import networkx as nx
G = nx.from_pandas_edgelist(df,source="from", target="to",edge_attr=["weight"])
・ノードに関しては特に設定していないが、勝手に認識してくれるらしい。ノードを覗いてみると、ちゃんとA、B、C、Dが入っていた。
G.nodes
NodeView*1
・せっかくなので、ノードの色と大きさをdegreeで変わるように設定する。ノードの大きさがsizesで、色がcolors。
from sklearn.preprocessing import minmax_scale
import matplotlib.pyplot as plt
sizes = [n*300 for n in list(dict(nx.degree(G)).values())]
colors=minmax_scale(list(dict(nx.degree(G)).values()))
・最後に、図示してみた。
nx.draw(G, with_labels=True, node_size = sizes, node_color=colors, cmap=plt.cm.cool, width=df["weight"])
・表からガサっと図を描けると楽しいかも。
おわり。
*1:'A', 'B', 'C', 'D'