在 Jupyter Python 中使用 Graphviz 设置节点位置

JmM*_*mML 4 python position graphviz nodes jupyter

我想制作一个具有随机节点位置的图表,但节点的“pos”属性似乎没有任何作用。这是一个最小的例子:

import graphviz
import pylab
from graphviz import Digraph

g = Digraph('G', filename='ex.gv',format='pdf')
g.attr(size='7')
g.node('1',pos='1,2')
g.node('2',pos='2,3')
g.node('3',pos='0,0')
g.edge('1','2')
g.edge('1','3')
graphviz.Source(g)
Run Code Online (Sandbox Code Playgroud)

关于如何实现这一目标有什么想法吗?提前致谢。

mag*_*jac 5

虽然文档中不是 100% 清楚,但我认为输入的点引擎不支持pos 。fdp或neato引擎确实支持输入上的pos来设置初始位置,如果您以“!”结束坐标规范,坐标不会改变,从而成为最终的节点位置。

在https://beta.observablehq.com/@magjac/placing-graphviz-nodes-in-fixed-positions上玩一个实时示例

这个独立的 python 脚本生成一个包含预期节点位置的 pdf:

#!/usr/bin/python

import graphviz
from graphviz import Digraph

g = Digraph('G', engine="neato", filename='ex.gv',format='pdf')
g.attr(size='7')
g.node('1',pos='1,2!')
g.node('2',pos='2,3!')
g.node('3',pos='0,0!')
g.edge('1','2')
g.edge('1','3')
g.render()
Run Code Online (Sandbox Code Playgroud)

由于 SO 不支持 pdf 上传,因此这里是使用相同代码生成的 png 图像,除了 format='png':

在此输入图像描述

如果没有感叹号,您会得到:

在此输入图像描述

根本没有任何 pos 属性,您会得到类似(但不完全相同)的结果:

在此输入图像描述