我希望按照 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()
我对节点的定位方式不满意。我希望它们按照预定义的方案定位,类似于常规网格,同时仍保持无标度功能: / p>
我可以创建一个反映我网格的位置字典:
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图形,也就是说根据我的网格?
答案 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()
转置模块和整数除法运算符可以转换行和列:
pos = {i : (i // ncols, (n-i-1) % ncols) for i in G.nodes()}
产量
将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
大多数图形包都会将节点放置到包中 - 我没有使用过(我也不想使用)这使得它成为数据科学家/软件工程师的任务
有兴趣了解你如何继续......