【问题标题】:Lost x y edge when using rank=same使用 rank=same 时丢失 x y 边缘
【发布时间】:2021-08-08 17:12:33
【问题描述】:

我正在尝试使用 GraphViz 可视化双向链表。 一个例子:

digraph List {
    rankdir=LR;
    node [shape=record];
    0 [label="{<prev> | <length> 2 | <tone> 1 | <next>}"];
    1 [label="{<prev> | <length> 1 | <tone> A | <next>}"];
    0:<next>:c -> 1:n [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=1.2];
    1:<prev>:c -> 0:s [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=1.2];
}

结果很好,除了一件事;元素的高度。随着每个连续元素的添加高度降低,我希望所有元素都处于相同的高度。但是当我添加

{rank=same; 0; 1;}

出现 GraphViz 错误 (Error: lost 1 0 edge)。现在,我能找到的唯一解决此错误的方法是用纯文本节点替换记录形状的节点并使用 HTML 标签来创建记录形状。 我试过这个,但它产生了同样的错误。

使用 HTML 标签的代码:

digraph List {
    rankdir=LR;
    node [shape=plaintext];
    0 [label=<
    <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
        <TR>
            <TD PORT="prev">     </TD>
            <TD PORT="length">2</TD>
            <TD PORT="note">1</TD>
            <TD PORT="next">     </TD>
        </TR>
    </TABLE>>];
    1 [label=<
    <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
        <TR>
            <TD PORT="prev">     </TD>
            <TD PORT="length">1</TD>
            <TD PORT="note">A</TD>
            <TD PORT="next">     </TD>
        </TR>
    </TABLE>>];
    0:next:c -> 1:n [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=0.8];
    1:prev:c -> 0:s [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=0.8];
}

对于如何解决此问题的任何建议,我将不胜感激。

之前的尝试如下所示:

digraph List { 
    rankdir=LR;
    node [shape=record];
    0 [label="{<prev> | <firstName> Wolfgang Amadeus | <lastName> Mozart | <instrument> Klavier | <next>}"];
    1 [label="{<prev> | <length> 1 | <tone> A | <next>}"];
    0:<next>:c -> 1:<prev> [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=0.8];
    1:<prev>:c -> 0 [arrowhead=vee, arrowtail=dot, dir=both, tailclip=false, arrowsize=0.8];
}

这两个箭头之间没有明显的区别。在节点之间设置两个不同的箭头也可以解决我的问题。

【问题讨论】:

    标签: graphviz graph-visualization


    【解决方案1】:

    您可以在第一个节点的最后一个元素和第二个节点的第一个元素之间使用强(“重”)链接(一条不可见的边)对齐节点。

    将这一行作为最后一行添加到类似 HTML 的代码中(这比记录形状更灵活)

    0:next:e -> 1:prev:w[ weight = 100, style = invis ];
    

    你得到

    这就是我认为你想要的。

    【讨论】:

    • 这正是我所需要的,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多