使用grid_2d_graph在networkx中绘制MxM节点的方形网格时移除旋转效果

2024-09-30 19:31:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要生成一个有100x100节点的正则图(也称为晶格网络)。我从绘制10x10图开始,代码如下:

import numpy
from numpy import *
import networkx as nx
from networkx import *
import matplotlib.pyplot as plt

G=nx.grid_2d_graph(10,10)        
nx.draw(G)

plt.axis('off')
plt.show()

但我得到的是:

enter image description here

有没有办法消除这种输出的旋转效应?我的最终网络必须看起来像一张象棋桌,就像这样(请忽略标签):

enter image description here

另外,我需要给每个节点一个ID,范围从0到9999(对于100x100网络)。任何想法都将不胜感激!在


Tags: 代码fromimport网络numpynetworkx节点matplotlib
2条回答

默认情况下,^{}使用spring布局。相反,您可以使用参数pos提供自己的位置。这实际上很简单,因为给定networkx.grid_2d_graph的节点标签实际上是一个(行,列)元组:

>>> G=nx.grid_2d_graph(2,2)
[(0, 1), (1, 0), (0, 0), (1, 1)]

因此,可以使用节点的名称作为其位置。所以您只需要创建一个字典映射节点到它们自己,并将其作为位置传递。在

^{pr2}$

但是,由于您还想添加节点标签,所以应该使用^{},它将自定义标签的字典作为可选参数。您需要一个字典将节点映射到它们的新标签。由于NetworkX在默认情况下为每个节点提供了标签(行、列),所以我们只需用row*10+column标记每个节点:

labels = dict( ((i, j), i * 10 + j) for i, j in G.nodes() )

将其组合在一起,您将得到以下代码,该代码将生成以下图表:

import networkx as nx
import matplotlib.pyplot as plt

N = 10
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i, j), i * 10 + j) for i, j in G.nodes() )
nx.draw_networkx(G, pos=pos, labels=labels)

plt.axis('off')
plt.show()

plot

编辑

根据@abdallahsobey的建议,我们可以从左到右和从上到下标记节点。在

labels = dict( ((i, j), i + (N-1-j) * 10 ) for i, j in G.nodes() )

better-labeled-plot

支持@mdml答案的澄清(这里所说的所有内容都将参考@mdml的答案)

1-节点关键点使用nx.grid_2d_图形

给节点的键隐式地给每个节点一个(i,j)键来描述行和列。访问(0,0)->;G[(0,0)]

2-用于绘图的标签

为图纸指定的标签应按以下方式进行,以遵守问题中的编号方案:

labels = dict( ((i, j), i + (N-1-j) * N ) for i, j in G.nodes() ) 

请注意,它应该是N而不是10,这样就更一般了,好像你改变了N标签将不是你期望的那样。此外,这些标签仅用于绘图,因此它们与访问节点无关。在

3-链接键到标签

访问节点->;G[(0,0)]指的是所绘制图形中的节点90(通常是左下角),G[(1,0)]是右侧的节点(91),而G[(0,1)]是标记为(80)的节点,因此请注意此约定,因为它可能不太明显。在

4-给出与图上的节点ID相等的节点ID

您可以使用标签字典向每个节点添加一个名为id的属性,该节点包含您在绘制的图形中看到的整数:

^{pr2}$

我创建了一个N=2的简单图形,并使用点2和3处的线条,然后打印出Id,如下所示:

for i in xrange(N):
    for j in xrange(N):
        print 'Node ID at: (%d, %d) = %d'  %(i,j,G.node[(i,j)]['id'])
plt.axis('off')
plt.show()

结果:

Node ID at: (0, 0) = 2
Node ID at: (0, 1) = 0
Node ID at: (1, 0) = 3
Node ID at: (1, 1) = 1

enter image description here

相关问题 更多 >