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

使用pygraphviz与dot布局生成图形失败,报triangulation failed错误

Python 3.6 + pygraphviz 1.6 graph.layout("dot") 报错解决方法

错误信息

执行graph.layout("dot")时触发如下错误:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 2882, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-d73a7e09eb44>", line 6, in <module>
    graph.layout("dot")
  File "/usr/local/lib/python3.6/dist-packages/pygraphviz/agraph.py", line 1422, in layout
    data = self._run_prog(prog, " ".join([args, "-T", fmt]))
  File "/usr/local/lib/python3.6/dist-packages/pygraphviz/agraph.py", line 1387, in _run_prog
    raise OSError(b"".join(errors).decode(self.encoding))
OSError: libpath/shortest.c:324: triangulation failed
libpath/shortest.c:200: destination point not in any triangle
Error: in routesplines, Pshortestpath failed

复现步骤

  1. 准备graph_data.txt文件
  2. 运行以下代码(注:原代码文件打开模式有误,已修正为rb):
import pygraphviz as pgv
with open("graph_data.txt", "rb") as fp:
    graph_data = fp.read()
graph = pgv.AGraph()
graph.from_string(graph_data)
graph.layout("dot") 
graph.draw(settings.PIPELINE_GRAPH_PATH, format="pdf")

解决方案

该错误是Graphviz的dot布局引擎计算边的样条路径时的三角化失败导致,可尝试以下方法解决:

  • 更换布局引擎:改用neato、fdp或sfdp等其他布局算法,这些引擎的逻辑与dot不同,可能避开该问题:

    graph.layout("neato")  # 或 "fdp" / "sfdp"
    
  • 禁用样条曲线:关闭dot的边样条渲染,使用直线连接绕过路径计算问题:

    graph.layout(prog="dot", args="-Gsplines=false")
    
  • 优化图形数据:检查graph_data.txt中是否存在重复节点、强制固定位置的节点、大量自环或异常边,移除这类可能引发布局冲突的元素。

  • 升级系统Graphviz:虽然Python和pygraphviz版本无法升级,但可通过系统包管理器(如apt、yum)更新Graphviz工具,新版本可能修复该bug。

  • 调整图形属性:添加属性避免布局冲突,比如禁用节点固定位置、明确布局方向:

    graph.graph_attr["fixedsize"] = "false"
    graph.graph_attr["rankdir"] = "TB"
    

内容的提问来源于stack exchange,提问作者user1315621

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:57:09