Python:如何生成具有预定义节点位置的无标度网络?

时间:2016-02-18 11:05:42

标签: python dictionary grid networkx

我希望按照 Barabasi-Albert 算法生成一个无标度网络,该算法涉及增长优先附件

我使用以下脚本来创建网络:

import networkx as nx
import matplotlib.pyplot as plt

n=100 #Number of nodes
m=4 #Number of initial links
seed=100
G=nx.barabasi_albert_graph(n, m, seed)
nx.draw(G)
plt.show()

这会产生以下输出: enter image description here

我对节点的定位方式不满意。我希望它们按照预定义的方案定位,类似于常规网格,同时仍保持无标度功能: / p>

enter image description here

我可以创建一个反映我网格的位置字典:

pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i, j), i + (n-1-j) * n ) for i, j in G.nodes() )
inds=labels.keys()
vals=labels.values()
inds.sort()
vals.sort()
pos2=dict(zip(vals,inds))

我的问题:如何修改脚本以获取具有pos2中指定的节点位置的Barabasi-Albert图形,也就是说根据我的网格?

2 个答案:

答案 0 :(得分:3)

import networkx as nx
import matplotlib.pyplot as plt

n = 100  # Number of nodes
m = 4  # Number of initial links
seed = 100
G = nx.barabasi_albert_graph(n, m, seed)

ncols = 10
pos = {i : (i % ncols, (n-i-1) // ncols) for i in G.nodes()}
nx.draw(G, pos, with_labels=True)    
plt.show()

enter image description here

转置模块和整数除法运算符可以转换行和列:

pos = {i : (i // ncols, (n-i-1) % ncols) for i in G.nodes()}

产量

enter image description here

将y值从(n-i-1) % ncols更改为ncols - (n-i-1) % ncols会翻转关于水平轴的图像:

pos = {i : (i // ncols, ncols - (n-i-1) % ncols) for i in G.nodes()}

答案 1 :(得分:1)

您计划在图表上放置多少个节点? 一旦你开始获得超过100个 - 除非你拥有惊人数量的视觉空间,否则添加更多节点通常会毫无意义。

我过去曾使用过多种工具 - 而且从来没有找到过最好的工具

* pygraph
* A Microsoft Graphing engine
* GraphDb - lots of query node power there
* IBM Products - for spacial visualisation

大多数图形包都会将节点放置到包中 - 我没有使用过(我也不想使用)这使得它成为数据科学家/软件工程师的任务

有兴趣了解你如何继续......