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

4

我想要制作一个随机节点位置的图表,但是似乎节点的"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)

有任何想法可以实现这个吗? 提前致谢。
1个回答

5
尽管文档不是100%清晰,但我认为pos在输入中的点引擎中不受支持。 fdpneato引擎支持输入时设置initial位置的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()

由于SO不支持PDF上传,这里是使用相同代码生成的PNG图像,除了格式为'png'之外:

enter image description here

没有感叹号,你会得到:

enter image description here

如果没有任何pos属性,你会得到类似的结果(但并非完全相同):

enter image description here


不幸的是,fdp或neato引擎似乎在没有pos属性的情况下输出相同的结果。 - JmML
也许你在坐标规范的末尾没有放感叹号?请参考 https://www.graphviz.org/doc/info/attrs.html#k:point。 我已经更新了我的回答,让它更明确地指出这在你的情况下是必需的。 - magjac
“!”在Python中没有起作用,但在您的实例中它能够工作。 - JmML
1
我已经更新了答案,并提供了可用的Python代码。我不确定你代码中的 graphviz.Source(g) 是做什么的,但至少它没有为我生成任何图形。这可能是你的问题,或者可能是你正在使用的Jupyter环境。也许那里有一个旧版本的Graphviz? - magjac
文档明确说明哪些引擎支持POS:“在neato和fdp中,可以使用pos来设置节点的初始位置”。来源:https://graphviz.org/docs/attrs/pos/ - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接