问题描述
根据this answer.,对networkx
包进行了微小的更改,使其表现出我想要的样子
# ADD THIS LINE - prevent things from flying off into infinity if not connected
displacement = displacement - pos / ( k * np.sqrt(nnodes))
有没有一种方法可以以编程方式执行此操作而不实际修改源代码?这是“猴子修补”的情况吗?如果可能的话,我该怎么办?
解决方法
查看链接的答案和spring_layout函数的代码,您要执行的操作就是更改函数_fruchterman_reingold
。由于无法在运行时在函数内添加代码行,因此需要定义自己的函数以实现所需的更改,然后将内部networkx _fruchterman_reingold
绑定到函数,这确实是一种猴子修补。该代码可能如下所示:
# Assume you already defined the modified function and name it my_reingold
import networkx as nx
nx.drawing.layout._fruchterman_reingold = my_reingold
也就是说,无需在运行时修补Networkx源代码或猴子修补程序,您只需从layout.py文件(即fruchterman_reingold_layout,_fruchterman_reingold,_sparse_fruchterman_reingold)复制所需的代码并创建您的小功能/模块,这本来就更安全,但也许乐趣可能会减少。