问题描述
我很难理解如何使用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()