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

FaC*_*fee 5 python grid rotation networkx mathematical-lattices

我需要生成一个有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()
Run Code Online (Sandbox Code Playgroud)

但我得到的是这个:

在此输入图像描述

有没有办法摆脱输出的这种旋转效应?我的最终网络看起来像棋盘,就像这样(请忽略标签):

在此输入图像描述

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

mdm*_*dml 7

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

>>> G=nx.grid_2d_graph(2,2)
[(0, 1), (1, 0), (0, 0), (1, 1)]
Run Code Online (Sandbox Code Playgroud)

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

pos = dict( (n, n) for n in G.nodes() )
Run Code Online (Sandbox Code Playgroud)

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

labels = dict( ((i, j), i * 10 + j) for i, j in G.nodes() )
Run Code Online (Sandbox Code Playgroud)

将所有内容放在一起,您将获得以下代码,生成下图:

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()
Run Code Online (Sandbox Code Playgroud)

情节

编辑

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

labels = dict( ((i, j), i + (N-1-j) * 10 ) for i, j in G.nodes() )
Run Code Online (Sandbox Code Playgroud)

更好的标记,情节

  • 这是一个非常好的答案,只需在问题中按照标签方案进行一些小改动就可以将标签dict更改为:labels = dict(((i,j),(i)+(N-1-j)*10)对于i,j在G.nodes())@FrancescoCastellani (2认同)
  • @AbdallahSobehy:好主意!看到我更新的答案. (2认同)