如何使用NetworkX的rescale_layout?

问题描述

我很难理解如何使用NetworkX的rescale_layout

文档说:pos (numpy array) – positions to be scaled. Each row is a position不是NetworkX其余部分用于绘图的标准“位置字典”。我尝试在“ pos dict”上使用NetworkX的to_numpy_array失败,并且to_numpy_array输出Graph adjacency matrix,与{{1}的要求不符}的rescale_layout

我问的原因是因为我有一个网络,该网络是由一些数据生成的,然后由spring_layout移动,但是某些位置并不是以“很好”的方式生成的,所以我实现了一种手动调整这些位置的方法,如果保证网络具有始终位于某个预定义边界内的位置(例如,图中的[-10,10]),则将更容易进行此操作。然后,我需要在节点上方写节点标签

奖金问题:我想在位置(x,y + r)处写标签,其中r是绘制节点的半径。通过输入节点大小的平方根并将其除以任意因子,我有一种共同的方法。但是,我不知道绘制节点的大小是如何实际确定的,我制作的每个图似乎对每个图都有不同的内部比例,而绘制的节点大小似乎保持不变。

我翻阅了大量文档以尝试理解底层方法,但是我剥离的每一层只会增加更多的混乱。

解决方法

这是您的布局示例:

pos = nx.random_layout(G)

并将其分配给如下形式的字典:

{0: array([0.81931883,0.8001609 ],dtype=float32),1: array([0.89695644,0.6070644 ],2: array([0.89160234,0.47174907],3: array([0.20430276,0.8206253 ],4: array([0.27929142,0.08657268],dtype=float32)}

现在,由于nx.rescale_layout()的输入应为numpy数组,因此您可以使用命令将其提取

np.array(list(pos.values()))

请注意,在其他版本的Python上,这种方式可能是different。 我将举例说明在重新调整pos参数之后发生的变化:

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np

G = nx.Graph()
G.add_edges_from([[0,1],[1,2],[2,3],[3,4],[4,0]])
pos = nx.random_layout(G)
coords = np.array(list(pos.values()))

fig,ax = plt.subplots()
plt.subplot(211)
nx.draw_networkx(G,pos,with_labels=True)
plt.axis('on'); plt.tick_params(left=True,bottom=True,labelleft=True,labelbottom=True) #force axis to turn on

plt.subplot(212)
new_pos = nx.rescale_layout(coords)
nx.draw_networkx(G,new_pos,labelbottom=True) #force axis turn on
plt.show()

enter image description here