使用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
复现步骤
- 准备
graph_data.txt文件 - 运行以下代码(注:原代码文件打开模式有误,已修正为
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
相关产品推荐
相关产品推荐

