【问题标题】:Orthogonal edges layout in graphvizgraphviz中的正交边布局
【发布时间】:2018-08-09 17:38:39
【问题描述】:

我正在尝试使用 graphviz 生成正交图:

graph G {
    layout=neato
    splines=ortho

    A1 [ pos="1,1!" ]
    A2 [ pos="2,1!" ]
    A3 [ pos="3,1!" ]
    A4 [ pos="4,1!" ]
    Ae [ pos="5,1!" style=invis]

    B1 [ pos="6,6!" ]
    B2 [ pos="6,5!" ]
    B3 [ pos="6,4!" ]
    B4 [ pos="6,3!" ]

    C1 [ pos="1,8!" ]
    C2 [ pos="2,8!" ]
    C3 [ pos="3,8!" ]
    C4 [ pos="4,8!" ]

    A1 -- C1
    A2 -- C2
    A3 -- B3
    A4 -- B4
    C3 -- B2
    C4 -- B1
}

产生以下内容: orthogonal graph

我的问题是:

  1. 是否可以生成类似的布局,而无需使用整洁和硬编码的节点位置?

  2. 如何强制连接到 A3、A4、C3、C4 的边与 A1、A2、C1、C2、B1-4 的情况一样完美地对齐到节点的中间?

  3. 如何在不改变布局的情况下将A1-4、C1-4、B1-4围成三个盒子? (我已经尝试过子图集群,但它们似乎不受neato 布局的支持;HTML 表格是选项,但它们似乎在连接单元格时并不完美 - 端口)

  4. 是否可以删除不可见的“Ae”节点并保存当前布局? (当我删除“Ae”时,一些边缘会改变它们的布局......)

【问题讨论】:

    标签: layout graphviz dot orthogonal


    【解决方案1】:

    对于 1.) 没有
    2.) 只需使用 pos
    3.) 请展示您的尝试,以便我们或许可以对此进行详细说明。
    4.) 没有

    也许您尝试像 UML-Modelling- 或 Visio-Tool 一样使用 graphviz。在核心中,graphviz 更多地用于将布局创建为输出,而不是将布局信息用作输入。

    【讨论】:

    • 感谢您的回答。让我问一下 (2) - 我已经检查了 neato guide 不包含任何使用 pos 边缘的示例。那么我该如何使用它呢?一般来说,我对任何允许其自动化的开源工具持开放态度。例如,我考虑的解决方案是“直接”生成 SVG。但是,我希望能更快地找到图形形状原型设计的意义——SVG 需要手动计算。现在我也看到graphviz有这样的需求。
    • 您可以使用例如边缘 [shape=point] 并且瞧,您有一个真正的 pos 坐标的锚点。几天前我发现了强大的 pos 属性,请参阅:tweet-about coordinates in graphviz。您必须纳入的最重要的行为是,零就在图表的中心。
    • 我了解pos 属性在neato 节点中的用法,但我从未听说过它在graphviz eges 中的用法。您想详细说明您的想法吗?
    【解决方案2】:

    首先,neato引擎或其他引擎中似乎没有edge的pos属性。我关注this answer 来解决这个问题。使用带有(宽度属性0)的点形状来控制边缘。

    代码示例如下:

    digraph {
        graph [bgcolor=white size="5.0,6.66!"]
        node [fixedsize=true]
        P1 [label=hello fontname=FangSong pos="2.604,4.583!" shape=rect]
        P0 [label=graphviz fontname=FangSong pos="0.521,5.625!" shape=rect]
        point1 [label="" fontname=FangSong pos="1.562,5.625!" shape=point width=0]
        point2 [label="" fontname=FangSong pos="1.562,4.583!" shape=point width=0]
        P0 -> point1 [arrowhead=none]
        point1 -> point2 [arrowhead=none]
        point2 -> P1 [arrowhead=normal]
    }
    

    图是:

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多