考虑以下子图,包含5个Mrecod节点:
有没有办法强制垂直方向,节点在彼此之上?我在子图中尝试了rankdir=TB
,但没有效果。
我在Ubuntu下运行graphviz,没有特殊参数:
dot -Tpng graph.dot -o img/graph.png
答案 0 :(得分:5)
我很确定rankdir
属性适用于整个图表,您无法隔离该特定子图。
rankdir=TB
是默认值,因此添加它实际上不会做任何事情。
那就是说,如果我正确地读你的子图,它看起来像是:
群集中有5个记录类型节点的集合。
每个节点都有来自群集外一个或多个节点的入站边。
群集中的所有节点都没有边缘。
如果这是正确的,那么子图中的节点具有相同的rank
(或者可能会这样做,具体取决于连接到它们的节点的等级)。设置rankdir=LR
(或rankdir=RL
)将更改该子图的方向,以便节点垂直对齐,但也会更改整个图的对齐方式。
让 这些节点垂直对齐的一种方法是在它们之间添加一条不可见的边。例如,如果您有节点A,B,C,D和E,则您的群集定义可能如下所示:
digraph G {
// ...skipping stuff outside the cluster...
subgraph clusterFoo {
node [shape=record]
A [label="..."]
B [label="..."]
C [label="..."]
D [label="..."]
E [label="..."]
edge [style=invis]
A -> B -> C -> D -> E
}
}
添加边将强制子图中的节点具有不同的等级,因此默认的rankdir=TB
将从上到下而不是从左到右布置节点。这些“假”边缘的style=invis
属性会使它们不可见。
如果要调整群集中节点的间距或对齐方式,您可能还需要使用边缘属性,例如weight
或minlen
/ attrs.html#d:minlen),或者在入站边缘考虑constraint=false
。
如果我误解了您的图表或者这对您没有帮助,您是否可以更新您的问题以添加您正在使用的DOT文件的最小示例?
PS:在Ubuntu上,您可以使用:
dot -Txlib graph.dot
快速打开一个窗口,在graph.dot中渲染图形,而不先将其写入文件。修改源文件时,渲染的图像甚至会自动更新。