【问题标题】:Force node to be directly beneath another node强制节点位于另一个节点的正下方
【发布时间】:2020-01-14 04:17:23
【问题描述】:

我有一个从左到右排列的图表。但是,此图中的某些元素我希望相对于另一个节点进行定位。例如,如果我有这个图表:

digraph "Test" {
    rankdir = "LR"
    A -> B
    B -> C
    D -> B
    note -> B

    note [ shape="house" ]
};

呈现如下:

但是,我希望“注释”节点始终位于它所指向的节点的正下方,如下图(手动创建):

我尝试使用不同的 rankdir 来尝试使用子图并摆弄 rankconstraint 属性,但未能成功,因为我只玩过 DOT几天。

【问题讨论】:

    标签: graph graphviz dot


    【解决方案1】:

    您可以在定义边之前枚举节点,然后将节点B 约束到与节点note 相同的等级,方法是将它们放在一个子图中:

    digraph "Test" {
        rankdir = "LR"
        A;D;
        {rank=same; note; B;}
        C;
    
        A -> B
        B -> C
        D -> B
        B -> note [dir=back]
    
        note [ shape="house" ]
    };
    

    请注意,为了使节点 note 低于节点 B,我必须反转边缘方向并添加 dir=back 才能正确绘制箭头。

    【讨论】:

    • +1 这被证明是其结果中最一致的,并给了我继续前进的动力。谢谢! :)
    • ^^^ 同意!能直接控制等级对我来说绝对是个新闻,谢谢你写的这么清楚!!!
    • 这会导致我的图表丢失边缘
    【解决方案2】:

    移动节点的一般技术是创建不可见的边缘。在您的情况下,您可以创建从 Anote 的边,将其标记为不可见,然后将 noteB 的边标记为非约束:

    A -> note [style="invis"];
    note -> B [constraint=false];
    

    【讨论】:

    • +1 在我的情况下这不是很稳定,但它是一种有趣的技术。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多