簡體   English   中英

Networkx Graph獲取每個節點的序列號

[英]Networkx Graph get sequence number for each node

我正在使用 networkx 生成如下生成的有向圖。 如何對節點進行編號,使其遵循從最低到最大的序列,並且當節點拆分為多個節點時,所有后續節點都獲得相同的序列號。 相反,它也可以將多個節點合並為單個節點

當前圖表當前圖表

未來圖未來圖

你想要做的叫做“在有向無環圖中對節點進行排名”

Networkx 沒有內置 function (據我所知),但可以通過簡單的算法完成:

  1. 如果節點沒有前任,則其等級設置為 1。
  2. 如果節點有前任,則其排名設置為“最大前任排名”加 1

這是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM