你好,我想用dot语言制作一个UML序列图,现在我遇到了以下问题:我想要将a、b、c和d排成一条直线放在顶部,但是连接线应该直接延伸到底部。我该如何实现呢?
a b c d
| | | |
| | | |
也许我可以实现将a、b、c和d及其相关的边缘作为集群,为这些集群设置不同的rankdir。编辑:刚刚发现通过在a、b、c和d之间添加不可见的边缘可以解决问题,但还有其他的解决方案吗?
有志者事竟成!
以下是使用点号的示例:
digraph SEQ_DIAGRAM {
graph [overlap=true, splines=line, nodesep=1.0, ordering=out];
edge [arrowhead=none];
node [shape=none, width=0, height=0, label=""];
{
rank=same;
node[shape=rectangle, height=0.7, width=2];
api_a[label="API A"];
api_b[label="API B"];
api_c[label="API C"];
}
// Draw vertical lines
{
edge [style=dashed, weight=6];
api_a -> a1 -> a2 -> a3;
a3 -> a4 [penwidth=5, style=solid];
a4 -> a5;
}
{
edge [style=dashed, weight=6];
api_b -> b1 -> b2 -> b3 -> b4;
b4 -> b5 [penwidth=5; style=solid];
}
{
edge [style=dashed, weight=6];
api_c -> c1;
c1-> c2 [penwidth=5, style=solid];
c2 -> c3 -> c4 -> c5;
}
// Draws activations
{ rank=same; a1 -> b1 [label="activate()"]; b1 -> c1 [arrowhead=normal]; }
{ rank=same; a2 -> b2 [style=invis]; b2 -> c2 [label="refund()", arrowhead=normal, dir=back]; }
{ rank=same; a3 -> b3 [arrowhead=normal, dir=back, label="place_order()"]; b3 -> c3; }
{ rank=same; a4 -> b4 [label="distribute()", arrowhead=normal]; }
{ rank=same; a5 -> b5 [style=invis]; b5 -> c5 [label="bill_order()", arrowhead=normal]; }
}
渲染后,将生成此图像:
以下是实现此图像的重要提示:
dot
所执行的操作。digraph SO {
a -> a1 -> a2
b -> b1 -> b2
c -> c1 -> c2
d -> d1 -> d2
}
呈现的效果如下所示:
如果您有一个更复杂的图表,可以使用rank=same
强制使节点处于相同的高度。例如:
digraph SO {
{ rank = same
a b c d
}
a -> a1 -> a2
b -> b1 -> b2 -> b3 -> b4
c -> c1
d -> d1 -> d2 -> d3
d2 -> a2
}
显示为:
然而,如果您希望a
、b
、c
和d
按特定顺序排列,我认为您需要使用像您建议的不可见边缘。 dot
指南甚至建议这样做:
当节点被限制在同一秩上时,边缘权重也起到作用。这些节点之间具有非零权重的边缘被指向尽可能远的相同方向(从左到右或从上到下在旋转的绘图中)。实际上可以通过在需要的位置放置不可见边缘(
style="invis"
)来调整节点排序。
msc {
A,B;
--- [label="Start", ID="1"];
A->B [label="signal"];
A<-B [label="signal"];
}
$: mscgen -T png -o example.png -i example.msc.
这个命令可以生成漂亮的时序图。
谢谢, Srikanth Kyatham
@startuml
Bob -> Alice : hello
@enduml
digraph sequenceDiagramExample {
bobHead [ label="Bob" pos="0,1.5!" shape="record" ];
bobPoint0 [ pos="0,0.75!" shape="point" width="0" ]
bobFoot [ label="Bob" pos="0,0!" shape="record" ];
aliceHead [ label="Alice" pos="1,1.5!" shape="record" ];
alicePoint0 [ pos="1,0.75!" shape="point" width="0" ]
aliceFoot [ label="Alice" pos="1,0!" shape="record" ];
bobHead -> bobPoint0 -> bobFoot [ dir="none" style="dashed" ]
aliceHead -> alicePoint0 -> aliceFoot [ dir="none" style="dashed" ]
bobPoint0 -> alicePoint0 [ label="hello" labelloc="c" style="solid" ]
}
$ brew install graphviz # requires Homebrew
时是这样的)digraph sequenceDiagramExample {...}
代码放入名为sequenceDiagramExample.dot
的文本文件中$ neato -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png
,将生成一个名为sequenceDiagramExample.png
的PNG文件neato
和dot
可执行文件。
neato
可能是你想要使用的,当你想要对元素的定位有更精细的控制时(欢迎在评论中提供其他观点!)neato
和使用dot
进行渲染(也包含在Graphviz中)dot
来渲染建议#2的有向图(例如$ dot -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png
)将产生以下结果...