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

Python:如何生成具有预定义节点位置的无标度网络?,python,dictionary,grid,networkx,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() 这将产生以下输出: 我对节点的定位

我想按照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()
这将产生以下输出:

我对节点的定位方式不满意。我希望根据预定义的方案定位节点,该方案类似于常规网格,同时仍保持无标度功能:

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

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图,也就是说根据我的网格?

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

我在过去使用过好几种工具,但从来没有发现一种是最好的

* pygraph
* A Microsoft Graphing engine
* GraphDb - lots of query node power there
* IBM Products - for spacial visualisation
大多数绘图软件包将节点放置留给软件包-我没有使用(也不想使用),这使得这成为数据科学家/软件工程师的任务


有兴趣了解您的进展情况…

您计划在图表上放置多少节点?
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()
一旦你开始获得超过100个节点,除非你有惊人数量的视觉不动产,否则添加更多节点通常是毫无意义的

我在过去使用过好几种工具,但从来没有发现一种是最好的

* pygraph
* A Microsoft Graphing engine
* GraphDb - lots of query node power there
* IBM Products - for spacial visualisation
大多数绘图软件包将节点放置留给软件包-我没有使用(也不想使用),这使得这成为数据科学家/软件工程师的任务

我很想看看你的进展如何

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()}


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

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()}

我计划添加20000个节点,但可视化不是我关心的问题。因此,您建议远离
networkx
?20k节点!!!呃,前几天我以8万美元起家。。。。过滤并将其放到一个包含800个密钥对的可视图形上。。。。这简直是一个黑色的可怕的混乱!!!然后,当我对800个密钥对应用一些过滤(并减少到大约250个条目)时,您可以识别一些有关网络图的信息。如果您不关心可视化,那么为什么要担心节点在图形上的位置?因为此脚本与执行计算的另一个脚本配对,并且它们基于节点位置。好的-这完全有意义。所以(假设我已经理解了这一点)-你填充你的Barabási–Albert模型-最流行的节点通常会获得更多链接(好的)。。。。只要您可以查询图形以找出节点的边,我就不会担心放置问题(除非节点具有地理关系)。放置节点的Python代码看起来不错。。。它正在使网络自动平衡,并在20K节点上重新排序,这将非常占用CPU。我还忘了提到graphX——同样值得一看——Apache、Spark、bigdata等节点都有地理关系。但是,如果我生成一个无标度网络并将其
G.edges()
写入csv文件,该怎么办?正是这个对象具有该网络的典型幂律特征。然后,我可以根据我的位置添加20000个节点,然后使用csv文件中的
G添加边()。这可能是一个合理的解决方法吗?我计划添加20000个节点,但可视化不是我关心的问题。因此,您建议远离
networkx
?20k节点!!!呃,前几天我以8万美元起家。。。。过滤并将其放到一个包含800个密钥对的可视图形上。。。。这简直是一个黑色的可怕的混乱!!!然后,当我对800个密钥对应用一些过滤(并减少到大约250个条目)时,您可以识别一些有关网络图的信息。如果您不关心可视化,那么为什么要担心节点在图形上的位置?因为此脚本与执行计算的另一个脚本配对,并且它们基于节点位置。好的-这完全有意义。所以(假设我已经理解了这一点)-你填充你的Barabási–Albert模型-最流行的节点通常会获得更多链接(好的)。。。。只要您可以查询图形以找出节点的边,我就不会担心放置问题(除非节点具有地理关系)。放置节点的Python代码看起来不错。。。它正在使网络自动平衡,并在20K节点上重新排序,这将非常占用CPU。我还忘了提到graphX——同样值得一看——Apache、Spark、bigdata等节点都有地理关系。但是,如果我生成一个无标度网络并将其
G.edges()
写入csv文件,该怎么办?正是这个对象具有该网络的典型幂律特征。然后,我可以根据我的位置添加20000个节点,然后使用csv文件中的
G添加边()。这可能是一个合理的解决方法吗?可爱的布局-添加更多的NOE,看看为什么有向图开始成为一种必需品,而不是奢侈品。如何更改节点位置,使第一行成为第一列?e、 例如,将节点标记为行而不是列。@CF84:将
%