You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:35:11