【问题标题】:Set node positions using Graphviz in Jupyter Python在 Jupyter Python 中使用 Graphviz 设置节点位置
【发布时间】:2018-12-18 17:29:08
【问题描述】:

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

关于如何实现这一目标的任何想法? 提前致谢。

【问题讨论】:

    标签: python position nodes jupyter graphviz


    【解决方案1】:

    虽然文档中没有 100% 清楚,但我认为输入点引擎不支持 posfdpneato 引擎支持 pos 输入以设置 initial 位置,如果您结束坐标用'!'指定,坐标不会改变,因此成为最终节点位置。

    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 图片,除了 format='png':

    没有你得到的感叹号:

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

    【讨论】:

    • 不幸的是,fdp 或 neto 引擎似乎在没有 pos 属性的情况下输出相同的结果
    • 也许你没有在坐标说明的最后加上感叹号?见graphviz.org/doc/info/attrs.html#k:point。我已经更新了我的答案,以明确说明您的情况需要这样做。
    • “!”在 python 中没有做到这一点,但在你的例子中它可以工作
    • 我已经用工作 Python 代码更新了答案。我不确定您代码中的graphviz.Source(g) 是做什么的,但至少它没有为我生成任何图表。这可能是您的问题,也可能是您正在使用的 Jupyter 环境。也许那里有旧的 Graphviz 版本?
    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 2016-04-17
    • 2013-03-23
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多