Mar*_*ian 5 python layout graph networkx pyvis
我正在尝试可视化一个大型网络,pyvis并面临两个问题:
禁用物理有助于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)
感谢您的帮助!
可以将坐标传递x到ypyvis 节点(请参阅此处的文档)。然后,您可以使用 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)