均匀分布 pygraphviz 节点

evenly distribute pygraphviz nodes

我有这样的 graphviz 代码:

        import pygraphviz as pgv
        A = pgv.AGraph(strict=False, directed=True,
                       overlap=False, sep="+10,10")
        [A.add_node(k) for k, v in S]  # adding all nodes

        A.add_edge(S.created, S.packaged_unassigned)
        A.add_edge(S.packaged_unassigned, S.packaged_assigned)
        A.add_edge(S.packaged_assigned, S.packaged_unassigned, style="dotted")
        A.add_edge(S.packaged_assigned, S.shipped_to_distributor)
        A.add_edge(S.shipped_to_distributor, S.on_distributor_side_out)
        A.add_edge(S.on_distributor_side_out, S.shipped_to_deployer)
        A.add_edge(S.shipped_to_deployer, S.on_distributor_side_in)
        A.add_edge(S.on_distributor_side_in, S.shipped_to_lab)
        A.add_edge(S.shipped_to_lab, S.on_lab_side)
        A.add_edge(S.on_lab_side, S.analysis_completed)
        A.add_edge(S.analysis_completed, S.completed)
        A.layout()
        A.draw("status_chart.png")

产生这个输出: https://i.ibb.co/7pJQ8rd/Screenshot-2020-12-20-at-22-23-10.png

我担心的是节点似乎没有正确利用可用的 space。相反,它们只是跨越图像的对角线。 我怎样才能使 graphviz 更好地利用 space 来创建较小的图像,同时保持不重叠的约束?

一个约束条件是您指定了一个链式图。因此,情节在某种程度上受到了限制。

请参阅文档以了解一些可能的替代选项以指定:

https://pygraphviz.github.io/documentation/latest/reference/agraph.html

例如,您可以尝试指定横向视图 AGraph(风景='true'...)

您也可以尝试使用不同的布局指令:

可选prog=[‘neato’|’dot’|’twopi’|’circo’|’fdp’|’nop’]将使用指定的graphviz布局方法。

另见:

unflatten(args='')

调整有向图以改善布局纵横比。

您可以使用的另一种技术是分解图形的各个部分,使其看起来像这样(使用编号方案向节点添加文本标签):

(1) -> (2) ->(3)
(4) -> (5) ->(6)
...

注意:该库的 Python 文档 特别是 建议您还参考 Graphviz 文档...更多选项。

http://www.graphviz.org/doc/info/lang.html

http://www.graphviz.org/doc/info/attrs.html

例如:

http://www.graphviz.org/doc/info/attrs.html#d:ratio

http://www.graphviz.org/doc/info/attrs.html#a:layout

http://www.graphviz.org/doc/info/attrs.html#d:scale

画廊也有一些很好的例子,说明了不同参数的使用

http://www.graphviz.org/gallery/