pyvis:有没有办法在不丢失图形布局的情况下禁用物理?

Mar*_*ian 5 python layout graph networkx pyvis

我正在尝试可视化一个大型网络,pyvis并面临两个问题:

  1. 超长渲染
  2. 网络不稳定,即节点移动太快,很难与这样的网络交互。

禁用物理有助于toggle_physics(False)加快渲染速度并使网络静态,但会消除布局设置。这就是禁用物理后的样子: 链接。正如您所看到的,该图很混乱并且没有结构。我想要做的是禁用物理但保留布局设置,即我希望我的图形看起来像普通网络(例如类似于 中的弹簧布局networkX),并考虑每个边的权重。有办法这样做吗?

到目前为止,我发现pyvis只有层次结构布局,这不是我需要的。我认为集成networkX布局可能会有所帮助,但我不知道如何做到这一点,因为networkX允许将布局设置为函数中的关键字参数nx.draw(),这与我的情况不兼容。这是我的代码,以防它有助于理解我的问题:

g = nx.Graph()
edges_cards = cards_weights_df.values.tolist()
g.add_weighted_edges_from(edges_cards)

net = Network("1000px", "1800px")
net.from_nx(g)
net.toggle_physics(False)
net.show("graph.html")
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

jyl*_*lls 5

可以将坐标传递xypyvis 节点(请参阅此处的文档)。然后,您可以使用 networkx 创建图形布局并将结果位置传递到 pyvis 图形。请参阅下面nx.circular_layout()应用于空手道俱乐部网络的示例:

import networkx as nx
from pyvis.network import Network

G = nx.karate_club_graph()
pos=nx.circular_layout(G,scale=500)

net = Network()
net.from_nx(G)

for node in net.get_nodes():
  net.get_node(node)['x']=pos[node][0]
  net.get_node(node)['y']=-pos[node][1] #the minus is needed here to respect networkx y-axis convention 
  net.get_node(node)['physics']=False
  net.get_node(node)['label']=str(node) #set the node label as a string so that it can be displayed

net.toggle_physics(False)
net.show('net.html')
Run Code Online (Sandbox Code Playgroud)

这是圆形布局的结果:

在此输入图像描述

并且没有任何特定的布局:

import networkx as nx
from pyvis.network import Network

G = nx.karate_club_graph()

net = Network()
net.from_nx(G)

for node in net.get_nodes():
  net.get_node(node)['physics']=False
  net.get_node(node)['label']=str(node)

net.toggle_physics(False)
net.show('net.html')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述