使用 grid_2d_graph 在 networkx 中绘制 MxM 节点的方形网格时移除旋转效果
问题描述
我需要生成一个具有 100x100
节点的常规图(也称为格网络).我开始使用以下代码绘制 10x10
图形:
导入numpy从 numpy 导入 *将 networkx 导入为 nx从networkx导入*将 matplotlib.pyplot 导入为 pltG=nx.grid_2d_graph(10,10)nx.draw(G)plt.axis('关闭')plt.show()
但我得到的是:
有什么方法可以消除输出的这种旋转效应吗?我的最终网络必须看起来像一个国际象棋桌,就像这样(请忽略标签):
另外,我需要为每个节点提供其 ID,范围从 0 到 9999(在 100x100 网络的情况下).任何想法将不胜感激!
解决方案默认情况下,
编辑
使用@AbdallahSobehy 的建议,我们可以从左到右和从上到下标记节点.
labels = dict( ((i, j), i + (N-1-j) * 10 ) for i, j in G.nodes() )
I need to generate a regular graph (also known as lattice network) which has 100x100
nodes. I started off with drawing a 10x10
graph with the following code:
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()
but what I get is this:
Is there any way of getting rid of this sort of rotation effect the output has? My final network must look like a chess table, just like this (please ignore the lables):
Also, I need to give each node its ID, ranging from 0 to 9999 (in the case of the 100x100 network). Any idea will be much appreciated!
解决方案By default, networkx.draw
uses a spring layout. Instead, you can provide your own positions with parameter pos
. This is actually really simple, since the labels of nodes given networkx.grid_2d_graph
actually are a (row, column) tuple:
>>> G=nx.grid_2d_graph(2,2)
[(0, 1), (1, 0), (0, 0), (1, 1)]
Thus you can use a node's name as its position. So you just need to create a dictionary mapping nodes to themselves, and pass that as the position.
pos = dict( (n, n) for n in G.nodes() )
However, since you also want to add node labels, you should use networkx.draw_networkx
, which takes a dictionary of custom labels as an optional parameter. You'll need a dictionary mapping nodes to their new labels. Since NetworkX gives each node the label (row, column) by default, we can just label each node with row * 10 + column:
labels = dict( ((i, j), i * 10 + j) for i, j in G.nodes() )
Putting it all together, you get the following code which yields the graph below:
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()
EDIT
Using the suggestion from @AbdallahSobehy, we can label the nodes from left to right and top to bottom.
labels = dict( ((i, j), i + (N-1-j) * 10 ) for i, j in G.nodes() )
相关文章