48

我正在使用 graphviz (dot) 来生成您可以在下面看到的图表。左下角的节点(红色椭圆)会引起烦恼,因为它的边缘穿过相邻节点的多个边缘。有没有办法将节点放置到某个区域?

边与其他几条边相交的图

4

5 回答 5

62

您可以创建一个不可见的约束,以使红色节点出现在所有其他节点的左侧。

redNode -> leftmostNode [style=invis];

前:

前

后:

后

于 2011-08-11T16:19:02.087 回答
31

我喜欢@smokris 的[style=invis]技巧,它通过添加影响布局但不可见的边缘来说服 graphviz 把东西放在你想要的地方。


另一个技巧是constraint属性,它允许您添加可见但不影响布局的边缘。

如果添加新边会弄乱您的图形,请[constraint=false]在该边上设置:现在 graphviz 将在放置节点时忽略它。

如果false,则不使用边对节点进行排序。例如,在图中

digraph G {
    a -> c;
    a -> b;
    b -> c [constraint=false];  
}

b -> c在等级分配期间不会添加约束,因此唯一的约束是 a 高于 b 和 c,从而产生图形:

于 2017-05-10T17:43:10.763 回答
29

@Jannis,如果您仍然对此问题的答案感兴趣,实际上有一种方法可以控制单个节点的放置 - 您使用“pos”属性:

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

作为一个例子,你可以写:

n [pos="3,5!"];

这将迫使节点n精确地位于(3,5)

但是,这只适用于布局引擎“fdp”和“neato”。

于 2010-12-30T23:19:31.977 回答
9

我不知道有什么方法可以控制单个节点的放置。这并没有真正的意义,因为为了做到这一点,您需要知道最终图形的外观,但是手动放置一个节点会改变图形其余部分的呈现方式。

我通过更改在文件中定义节点的顺序并在图形级别.dot调整nodesep和属性解决了这个问题。ranksep这是一个细化的过程——一次调整一些东西,直到看起来正确。

您还可以将图形呈现为SVG,然后将其导入 Visio(或其他编辑器)并手动重新排列您不满意的节点。

于 2010-03-19T11:11:20.070 回答
0

如果使用带有 -n2 参数的neato,则可以放置节点:

`dot -T ${format} -n2 -Goverlap-true -Gsplines=false -Kneato -o ${ output } ${ input }`

例如

dot -T png -n2 -Goverlap-true -Gsplines=false -Kneato -o monkey.png monkey.dot

neato 期望从左下角开始的所有内容都以点(1/72 英寸)为单位。

以下点文件按指定放置所有内容,但有点烦恼的是位置始终是对象的中心

digraph G {
    overlap=true
    bgcolor="transparent"
    node [

        shape=box   
        width=1.2
        height=1.2
        fillcolor="#e9e9e9"
        fontcolor="#333333"
        fontsize=18
        style="filled"
        color="#aaaaaa"
    ];

    edge [
        penwidth=2  
        fontsize=18
        margin=0.01
        labelfloat=true
        fontcolor="#333333"
        color="#bbbbbb"
    ];

d [pos="864,2016!" ] [label="D" ]  [width=16  height=16]



subgraph x {

    node [color="#886600" fillcolor="#dd9944"]

    A [pos="1440,1440!" ] 

    c [pos="864,2016!" ] [label="C" ] 

        A -> c 

    monkey [pos="1008,1872!" ] [label="HI MONKEY" ] 

    A -> c  [label="THIS WAY" ]  [ pos="s,1440,1483 e,907,2016 1440,1488 1440,1856 1280,2016 912,2016" ][ lp="1360, 1936 " ] 

}

F [pos="576,1440!" ] 

up_left [pos="72,2808!"][label="" height=1 width=1 penwidth=0 color="red"]  down_right [pos="2808,72!"] [label="" height=1 width=1 fillcolor="red" penwidth=0 color="red"]

}

于 2021-11-13T04:35:39.860 回答