[英]Count the number of nodes and edges in each subgraph connected to one node in a weighted undirected graph with networkx
[英]Networkx Graph get sequence number for each node
你想要做的叫做“在有向無環圖中對節點進行排名” 。
Networkx 沒有內置 function (據我所知),但可以通過簡單的算法完成:
這是 Networkx 圖的示例:
import networkx as nx
# Create graph
G = nx.DiGraph()
G.add_edges_from([
('a', 'b'),
('b', 'c'),
('d', 'e'),
('e', 'f'),
('f', 'g'),
('g', 'h'),
('c', 'h'),
('i', 'f'),
('h', 'j'),
('j', 'k'),
])
讓我們像您的第一張圖片一樣繪制它(我建議您使用 Graphviz 布局):
nx.draw(
G,
pos=nx.nx_agraph.graphviz_layout(G, prog='dot'),
node_color='#FF0000'
)
然后我們使用拓撲排序進行適當的 DAG 迭代並使用上層算法:
for node in nx.topological_sort(G):
if not len(list(G.predecessors(node))):
G.nodes[node]['level'] = 1
else:
G.nodes[node]['level'] = max(
G.nodes[n]['level']
for n in G.predecessors(node)
) + 1
然后我們將在"level"
變量中獲得我們的排名數字
>>> G.nodes.data('level')
NodeDataView({'i': 1, 'a': 1, 'g': 4, 'b': 2, 'd': 1, 'j': 6, 'k': 7, 'c': 3, 'e': 2, 'h': 5, 'f': 3}, data='level')
最后我們使用節點等級作為標簽來繪制圖形:
nx.draw(
G,
pos=nx.nx_agraph.graphviz_layout(G, prog='dot'),
node_color='#FF0000',
labels={n: G.nodes[n]['level'] for n in G.nodes}
)
這是期望的結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.