【问题标题】:Graphviz top to bottom AND left to rightGraphviz 从上到下和从左到右
【发布时间】:2010-12-02 06:09:10
【问题描述】:

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

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

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

编辑刚刚通过在 a、b、c 和 d 之间添加不可见边找到了解决方案,但还有其他解决方案吗?

【问题讨论】:

    标签: uml diagram graphviz


    【解决方案1】:

    有志者事竟成!

    这是一个关于如何使用点的示例:

    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 将根据其自动排名对其进行定位。
    • 为了使事情变得直截了当,所有方向都是相同的:从 a 到 b 到 c。如果你颠倒其中一些,DOT 会弄得一团糟。在箭头上实现正确方向的技巧是使用 dir edge 属性。
    • 边缘的权重属性对于保持垂直线笔直非常重要。他们的人数必须超过最大的等级。如果您需要创建一个等级高达 100 的图表,您的体重必须至少为 101,否则将不可能有一条直的垂直虚线。
    • 为了得到一条直的水平线,您必须连接同一等级上的每个节点。否则,DOT 将弯曲线。例如,将 a1 连接到 c1 是通过将 a1 连接到 b1 并将 b1 连接到 c1 来实现的。

    【讨论】:

      【解决方案2】:

      您所描述的似乎是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
      }
      

      出来是这样的:

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

      边缘权重在以下情况下也起作用 节点被限制在相同的 秩。具有非零权重的边 这些节点之间的目标是跨越 同方向的排名 (从左到右,或从上到下在一个 旋转图)尽可能。 可以利用这一事实来调整 通过放置不可见的节点排序 边缘 (style="invis") 在需要的地方。

      【讨论】:

      • 啊抱歉,当你现在添加 d2 -> a2 我仍然想成为顶部的 a、b、c 和 d 但 a1、a2、a3 仍然像上面一样在一行中
      • 托管这些图像的任何东西现在都在发送广告。这可以解决吗?
      【解决方案3】:

      你可以试试 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

      【讨论】:

        【解决方案4】:

        建议 #1 - PlantUML

        PlantUML 使用 Graphviz,因此一种选择是简单地使用 PlantUML。例如,在 PlantUML 中,这...

        @startuml
        Bob -> Alice : hello
        @enduml
        

        ...被渲染成这样...

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

        建议 #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来渲染上图,你要做到以下几点:

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

        专业提示 - 不要将 neatodot 可执行文件混淆

        • neato 可能是您想要对元素的定位方式进行精细控制时想要使用的工具(欢迎使用 cmets 中的其他视点!)
        • 不要将渲染与 neato 与渲染与 dot 混淆(Graphviz 中也包含)
        • 例如,使用 dot(例如 $ dot -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png)从 Suggestion #2 渲染有向图将产生这个...

        【讨论】:

          猜你喜欢
          • 2021-11-05
          • 1970-01-01
          • 1970-01-01
          • 2015-05-08
          • 1970-01-01
          • 1970-01-01
          • 2014-12-31
          • 2010-12-03
          • 2019-10-22
          相关资源
          最近更新 更多