Graphviz从上到下,从左到右

时间:2009-09-29 08:43:09

标签: uml diagram graphviz

您好我想要一个带点语言的uml序列图,现在我有以下问题我希望布局如下,a,b,c和d在顶部的直线但是线路正在直接到底。我怎样才能做到这一点?

a   b   c   d
|   |   |   | 
|   |   |   |

也许我可以实现a,b,c和d及其所属边缘是群集,我为群集设置了不同的rankdir?

编辑刚刚通过在a,b,c和d之间添加不可见的边缘而不是任何其他解决方案找到了解决方案?

4 个答案:

答案 0 :(得分:7)

您所描述的内容似乎是dot默认执行的操作。

例如,此图表:

digraph SO {
  a -> a1 -> a2
  b -> b1 -> b2
  c -> c1 -> c2
  d -> d1 -> d2
} 

这样出来:

enter image description here

如果你有一个更复杂的图形,你可以使用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
}

这样出来:

enter image description here

但是,如果您希望abcd按特定顺序排列,我认为您将不得不使用不可见的边缘你建议。 dot指南甚至建议:

  

边缘权重也起作用   节点被约束为相同的   秩。边缘非零重量   这些节点之间的目标是   同一方向的排名   (从左到右,或从上到下)   旋转绘图)尽可能。   可以利用这一事实进行调整   通过放置不可见的节点排序   边缘(style="invis")在需要的地方。

答案 1 :(得分:7)

您可以尝试使用mscgen(消息序列图生成器)

一个简单的图表是example.msc

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

答案 2 :(得分:0)

建议1-PlantUML

PlantUML使用Graphviz,因此一种选择是仅使用PlantUML。例如,在PlantUML中,此...

@startuml
Bob -> Alice : hello
@enduml

...被渲染为此...

PlantUML rendered sequence diagram example

上面的图在http://plantuml.com/plantuml/...呈现,您可以阅读PlantUML序列图in the documentation。另外,也可以从the command line和PlantUML plugins are available for many popular IDEs中使用PlantUML。

建议2-NEATO

您还可以使用GraphvizNEATO(PDF)。例如,这个有向图...

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" ]
}

然后从命令行通过NEATO(与Graphviz一起安装)进行渲染...

...被渲染为此...

NEATO rendered sequence diagram example

要使用NEATO渲染上面的图像,请执行以下操作:

  1. 安装Graphviz随附的NEATO(至少在使用$ brew install graphviz # requires Homebrew的Mac上如此)
  2. 从上方将digraph sequenceDiagramExample {...}代码放在一个名为sequenceDiagramExample.dot的文本文件中
  3. 从命令行运行$ neato -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png,这将生成一个名为sequenceDiagramExample.png的PNG文件
  4. 查看PNG:)

专业提示-请勿将neatodot可执行文件混淆

  • neato可能是您想要对元素的位置进行粒度控制时要使用的(欢迎在注释中使用替代观点!)
  • 不要混淆neatodot的渲染(Graphviz也包括)
  • 例如,使用dot(例如$ dot -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png)从建议#2渲染有向图将产生此结果...

enter image description here

答案 3 :(得分:0)

有志者事竟成!

这是一个如何使用点进行操作的示例:

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]; }
}

渲染后,将产生此图像:

Sequence Diagram

关于如何实现此目标的一些重要提示:

  • 每个组件都有一个没有形状,没有高度和宽度的节点列表。
  • 每行必须处于同一等级,否则DOT会将其定位为自动排名。
  • 为了使事情变得直率,所有方向都是相同的:从a到b到c。如果您将其中的一些反转,DOT将会变得一团糟。实现箭头上正确方向的技巧是使用dir edge属性。
  • 边缘的权重属性对于保持垂直线笔直非常重要。他们必须超过最高级别。如果您需要创建等级最高为100的图表,则您的体重必须至少为101,否则就不可能有一条垂直的垂直虚线。
  • 为了获得一条水平直线,您必须将同一等级上的每个节点连接起来。否则,DOT将弯曲线。例如,通过将a1连接到b1和将b1连接到c1来实现将a1连接到c1。