说我有一个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是否适合这项任务?
答案 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随后从中心向外构建图形坐标。这可能需要一点点简单的三角函数,只有你的系统没有过度确定才会有效。