【问题标题】:Python: how to generate a scale-free network with pre-defined node positions?Python:如何生成具有预定义节点位置的无标度网络?
【发布时间】:2023-03-09 16:30:01
【问题描述】:

我想按照 Barabasi-Albert 算法生成一个无标度网络,该算法涉及 growthpreferential attachment

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

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

【问题讨论】:

    标签: python dictionary grid networkx


    【解决方案1】:
    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()}
    

    【讨论】:

    • 可爱的布局 - 添加更多 noes,看看为什么有向图开始成为必需品,而不是奢侈品。
    • 如何更改节点位置,使第一行成为第一列?例如,将节点标记为按行而不是按列。
    • @CF84:转置%// 运算符。我在上面添加了代码来说明我的意思。
    • 抱歉再次询问,但这对我来说很复杂,因为不完全清楚哪个是行的迭代器,哪个是列的迭代器。如果我希望节点 9、19、29、...、99 显示在上排而不是下排,该怎么办?这意味着相对于从节点 4 开始的行和从节点 5 开始的行之间穿过网络的水平线反映节点位置。谢谢。
    • 如果您正在绘制点 (x, y),其中 y 从 0N。然后水平翻转绘图,使y-value0 的点现在位于Ny-valueN 的点现在位于0,您将绘制(x, N-y)。同样,如果将(n-i-1) % ncols 更改为ncols - (n-i-1) % ncols,图像将围绕水平轴翻转。
    【解决方案2】:

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

    我过去曾使用过几种工具,但从未发现一种是整体上最好的

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

    大多数图形包将节点放置留给包 - 我没有使用(也不想使用),这使得这是数据科学家/软件工程师的任务

    有兴趣看看你的进展如何......

    【讨论】:

    • 我计划添加20000个节点,但可视化不是我关心的问题。所以你建议离开networkx
    • 20k 节点!!!呃,我前几天从 80K 开始......过滤并把它扔到一个有 800 个密钥对的可视图表上......这简直是一个黑色可怕的混乱!然后,当我对 800 个密钥对(并减少到大约 250 个项目)进行一些过滤时,您可以识别出有关网络图的一些信息。如果您不关心可视化,那么为什么要担心节点在图表上的位置?
    • 因为该脚本与另一个执行计算的脚本配对,并且它们基于节点位置。
    • 好的 - 这完全有道理。所以(假设我已经理解这一点) - 你填充你的 Barabási-Albert 模型 - 最流行的节点通常会获得更多的链接(好的)....只要你可以查询图表以找出节点的边缘我不会担心放置(除非节点具有 GEO 关系)。您放置节点的 Python 代码看起来不错……它使网络在 20K 节点处自动平衡和重新排序,这将是非常 CPU 密集型的。我也忘了提到 graphX - 也值得一看 - Apache、Spark、bigdata 等
    • 节点有GEO关系。但是,如果我生成一个单一的无标度网络并将其G.edges() 写入一个 csv 文件会怎样?正是这个对象具有这个网络典型的幂律特征。然后我可以根据我的位置添加 20000 个节点,然后从 csv 文件中添加带有G.add_edge() 的边。这可能是一个明智的解决方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2020-03-29
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多