繁体   English   中英

在 Networkx 中调整节点编号

[英]Adjusting node numbering in Networkx

以下代码生成特定网络的邻接矩阵。 但是,我希望节点编号以某种方式发生并保持固定,并且不会随着每次运行而波动。 我介绍了当前和预期的输出。

import matplotlib.pyplot as plt
import networkx as nx


N = 2

G = nx.Graph()
for u in range(2 * N * (N + 1)):
    if u % (2 * N + 1) < N:
        for v in (u - 2 * N - 1, u - N - 1, u - N):
            if G.has_node(v):
                G.add_edge(u, v)
    elif u % (2 * N + 1) == N:
        G.add_edge(u, u - N)
    elif u % (2 * N + 1) < 2 * N:
        for v in (u - 1, u - N - 1, u - N):
            G.add_edge(u, v)
    else:
        for v in (u - 1, u - N - 1):
            G.add_edge(u, v)
            
A=nx.adjacency_matrix(G).todense()
print([A])
nx.draw(G,with_labels=True, font_weight='bold')

当前输出为

在此处输入图像描述

预期的输出是

在此处输入图像描述

这是一个可能的解决方案:

import networkx as nx

N = 2

def pos():
    x, y = 1, N + 3 - 1
    for _ in range(2 * N * (N + 1)):
        yield (x, y)
        y -= (x + 2) // (N + 3)
        x = (x + 2) % (N + 3)

G = nx.Graph()
it_pos = pos()
for u in range(2 * N * (N + 1)):
    G.add_node(u + 1, pos=next(it_pos))
    if u % (2 * N + 1) < N:
        for v in (u - 2 * N - 1, u - N - 1, u - N):
            if G.has_node(v + 1):
                G.add_edge(u + 1, v + 1)
    elif u % (2 * N + 1) == N:
        G.add_edge(u + 1, u - N + 1)
    elif u % (2 * N + 1) < 2 * N:
        for v in (u - 1, u - N - 1, u - N):
            G.add_edge(u + 1, v + 1)
    else:
        for v in (u - 1, u - N - 1):
            G.add_edge(u + 1, v + 1)

nx.draw(G, nx.get_node_attributes(G, 'pos'), with_labels=True, font_weight='bold')

这是上面代码的结果: 在此处输入图像描述 这里我使用了pos()函数来生成每个节点的位置。 这些位置在每个节点内保存为元组(x, y)作为标签。 他们最终被用来绘制图表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM