如何用NetworkX与PyVis生成非全局独立双向箭头有向图?
解决Pyvis显示MultiDiGraph指定双向/单向箭头的问题
你的代码逻辑本身是对的,但可能因为双向边重叠或notebook=True的设置导致箭头显示不符合预期。以下是调整后的解决方案:
修正后的代码
import networkx as nx from pyvis.network import Network import webbrowser # 初始化MultiDiGraph G = nx.MultiDiGraph() # 添加边和节点 G.add_edges_from([('A', 'B'), ('B', 'A'), ('A', 'C')]) # 创建pyvis网络,非Notebook环境建议设notebook=False nt = Network(height="800px", width="1600px", notebook=False, directed=True) # 直接从NetworkX图导入所有节点和边(比手动添加更可靠) nt.from_nx(G) # 遍历所有边,确保每条边显示单向箭头 for edge in nt.edges: edge['arrows'] = 'to' # 给双向边添加曲线偏移,避免重叠(可选) if (edge['from'], edge['to']) in [('A','B'), ('B','A')]: edge['smooth'] = {'enabled': True, 'type': 'curvedCW', 'roundness': 0.1} # 生成并打开可视化页面 nt.show("graph.html") webbrowser.open("graph.html")
关键调整点
- 使用
nt.from_nx(G):直接从NetworkX图导入节点和边,避免手动添加时的遗漏或错误 - 设置
directed=True:明确声明为有向图,确保箭头渲染逻辑生效 - 给双向边添加曲线偏移:通过
smooth参数让A→B和B→A的边呈曲线分开,避免重叠导致箭头被遮挡 - 关闭
notebook=True:非Jupyter Notebook环境中,该参数可能导致渲染异常
补充说明
- 你之前尝试的
bidirectional=True是给单条边同时添加双向箭头,而你的场景是两条独立的单向边,因此不适用 - 若需要样式区分,可给不同边设置
color参数,例如:edge['color'] = '#ff0000' if edge['from'] == 'A' and edge['to'] == 'B' else '#00ff00'
内容的提问来源于stack exchange,提问作者PKrange
相关产品推荐
相关产品推荐

