7

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()

但我得到的是:

在此处输入图像描述

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

在此处输入图像描述

此外,我需要为每个节点提供其 ID,范围从 0 到 9999(在 100x100 网络的情况下)。任何想法将不胜感激!

4

2 回答 2

9

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

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

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

pos = dict( (n, n) for n in G.nodes() )

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

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()

阴谋

编辑

使用@AbdallahSobehy 的建议,我们可以从左到右和从上到下标记节点。

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

更好标记的情节

于 2015-10-16T13:22:01.833 回答
3

支持@mdml答案的说明(这里所说的都是参考@mdml的答案)

1-使用 nx.grid_2d_graph 的节点键

给节点的键是隐式完成的,给每个节点一个描述行和列的键 (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 的属性,该属性包含您在绘制图中看到的整数:

for (i,j) in labels:
    G.node[(i,j)]['id'] = labels[(i,j)]

我创建了一个 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

在此处输入图像描述

于 2015-10-16T20:49:32.993 回答