いろいろ倉庫

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

【Python】エッジリストからネットワーク図を描きたい

・お題:どのノードからどのノードにエッジが伸びているかと、そのエッジのウェイトが入っている表(エッジリスト)を入手した。ここから、ネットワーク図を描いてみたい。

 

・neoworkxを利用した。

networkx.org

・まずはエッジリストを適当に作成する。

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'