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网络的情况下).任何想法将不胜感激!
默认情况下,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)
归档时间: |
|
查看次数: |
1820 次 |
最近记录: |