计算并绘制边长与权重

时间:2015-08-04 08:47:32

标签: python numpy graph-theory networkx

说我有一个networkx图表:

g=nx.gnm_random_graph(5,5)
for u,v,w in g.edges(data=True):
    w = np.random.randint(0,10)

我想表示好像每条边都有一个固定的长度(它的重量值)。我所看到的网络本质上是放射状的 - 我事先知道这是可能的(我没有在unutbu的评论here中提出限制)。

我想随机计算节点的坐标(具有固定的边长约束)并绘制它们。然后,我希望将所有未通过边连接的节点之间的距离制成表格。

从我到目前为止所读到的内容来看,似乎networkx在不考虑边长的情况下绘制节点。但是可以明确定义节点位置。所以我需要编写一个函数来计算节点位置。

有没有人知道可能对此有帮助的networkx或其他功能?

更一般地说,networkx是否适合这项任务?

1 个答案:

答案 0 :(得分:0)

我偶然发现了这一点,即使它相当老,我也会试着给出答案:

首先,我尝试了你的代码,它似乎没有用。

In [60]:  for u,v,w in g.edges(data=True):
    ...:      w = np.random.randint(0,10)

给了我

In [61]:  list(g.edges_iter(data='weight',default = 1))
Out[61]:  [(0, 4, 1), (0, 2, 1), (1, 2, 1), (2, 3, 1), (2, 4, 1)]

所以权重都保持为'1'。这是合乎逻辑的,因为你只是在改变'w'而不是边缘参数'weight'。您可以使用以下方法实现此目的:

In [62]:  for u,v in g.edges():
    ...:      g[u][v]['weight'] = np.random.randint(0,10)

给你

In [63]:  list(g.edges_iter(data='weight',default = 1))
Out[64]:  [(0, 4, 1), (0, 2, 8), (1, 2, 7), (2, 3, 3), (2, 4, 8)]

通过传递具有每个节点的x和y坐标的dictonary来完成节点的放置。这样的dictonary可以通过使用networkx放置算法获得,这可以在这里f networkx.drawing.layout。使用networkx.circular_layout作为基础,您可以使用numpy随后从中心向外构建图形坐标。这可能需要一点点简单的三角函数,只有你的系统没有过度确定才会有效。