前回のつづき。
1.前回
from_pandas_edgelist。で読み込んだノードに属性を付ける方法として、networkxのset_node_attributesを使って
nx.set_node_attributes(G, node_attr_dic)
でnode_attr_dicという風に辞書を使えばOKと書いた。
2.失敗
しかしこれをpyvisで読み込ませてみると、せっかく入れたnode_attr_dicがすべて消えてしまうという素敵なことが起こっていた!
振り出しにもどる。
3.修正
ということで、結局辞書を使わず、最初に存在するエッジ情報(edges)からnode_dfを生成し、そこにpyvis用の属性情報を追加するという流れでやることに。
import networkx as nx
edges = pd.DataFrame({'source': ["A","A","A","B","B","C","C","D","E"],
'target': ["B","C","D","D","C","E","D","E","A"]})
G = nx.from_pandas_edgelist(edges, edge_attr=True)
これでedgesというデータフレームを作成してから、
def re_construct_network(edge_df):
#nodeの生成
G = nx.DiGraph
G = nx.from_pandas_edgelist(df2,source="source",target="target")
#node_df生成。一回edgelistからnetworkxを経由してノードリストを生成しておく。
node_df=pd.DataFrame(list(G.nodes()),columns=['nodes']).sort_values(by='nodes')
#この段階でnode_dfに列を追加して属性候補を入れても良い。
#edgelistの再生成()
edges=[]
for index, row in edge_df.iterrows():
edges.append((row[0],row[1]))
#nodeをpyvisに読ませる+同時にedgeをpyvisに読ませる。
g = Network(height='500px', width='750px',directed=True)
node_id = node_df['nodes'].tolist() #
node_x = ~~(出力時のx位置) #lambda式などでの処理もOK
node_y = ~~(出力時のy位置)
node_value = node_df['///'].tolist()
node_title = node_df['~~~'].tolist()
node_color = node_df['$$$'].apply(setcolor).tolist() #色指定の関数を外に出してlamda式で使う。
node_label = node_df["%%%"].astype(str).tolist()
#add_nodesで指定できるのが ["size", "value", "title", "x", "y", "label", "color"]
g.add_nodes(node_id,label=node_label, title=node_title,color=node_color)
g.add_edges(edges)
g.toggle_physics(True) #動かしたい場合
g.show_buttons(True) #出力後の調整バーを入れる場合
g.show("network_pyvis.html")
以下を実行すればnetwork_pyvis.htmlとして出力結果が見られる。
re_construct_network(edge_df)
g.add_nodesとg.add_edgesをする際にIDとして
node_idを指定して、node_idとedge_dfのsourceとtargetの要素が一致する
必要がある点がミソ。
ちょっと手間がかかるけど、node_dfに色々属性渡して保持できるのは便利。