收紧点图使其更加对称

时间:2011-07-15 23:05:50

标签: graph graphviz dot

我使用:dot graph.dot -Tpdf -ograph.pdf编译以下图表,生成:

enter image description here

结果还可以,但状态转换看起来很像一个spagetthi怪物,我不知道我能做些什么来解决这个问题。我尝试了其他布局:twopi, neato, etc.是否有参数允许它强制图形看起来更加对称?因为整体情况还可以。

对我来说,似乎边缘使用可用的最小空间来构造边缘描述,这可能是问题吗?

我的图表设计有缺陷吗?我应该在一条边上写入不同的状态转换,使用\ n来分隔不同的转换吗?

digraph finite_state_machine {
    rankdir=LR;
    edge [fontsize=26];
    node [shape = doublecircle, width=2.0, fontsize=24, fixedsize=true,style=filled, colorscheme=spectral5]; New  [fillcolor=3] Terminated [fillcolor=5];
    node [shape = circle, width=2.0, fontsize=24, fixedsize=true, colorscheme=spectral5]; Runnable [fillcolor=4] Waiting [fillcolor=2] "Timed\nWaiting" [fillcolor=2] Blocked [fillcolor=1];
    New -> Runnable [ label = "Thread.start" ];
    Runnable -> Waiting [ label = "Object.wait" ];
    Runnable -> Waiting [ label = "Thread.sleep" ];
    Runnable -> Waiting [ label = "LockSupport.park" ];
    Waiting -> Blocked [ label = "Reacquire monitor lock after\nleaving Object.wait" ]
    Waiting -> Blocked [label = "Spurious wake-up"]
    "Timed\nWaiting" -> Blocked [ label = "Reaquire monitor lock after\n leaving Object.wait" ]
    "Timed\nWaiting" -> Terminated [ label = "Exception" ]
    "Timed\nWaiting" -> Blocked [ label = "Spurious wake-up" ]
    Runnable -> "Timed\nWaiting" [ label = "Object.wait" ];
    Runnable -> Blocked [ label = "Contended Monitor\nEnter" ];
    Blocked -> Runnable [ label = "Contended Monitor\nEntered" ];
    Runnable -> Terminated [ label = "Thread finishes\nexecution" ]
    Runnable -> Terminated [ label = "Exception" ]
    Waiting -> Runnable [ label = "Object.notify\nObject.notifyAll" ]
        Waiting -> Terminated [ label = "Exception" ]
    "Timed\nWaiting" -> Runnable [ label = "Object.notify\nObject.notifyAll" ]
}

1 个答案:

答案 0 :(得分:7)

我不认为你的设计存在缺陷,我认为没关系。点语法是可读的,因此是可维护的,结果是自动生成的图形看起来很相似。

当然,您可以添加小的更正,以使此特定图表更好(或至少不同)。如果例如图表的源由应用程序生成,则其中一些可能难以实现。以下是一些想法:


要使布局更对称,您可以尝试对齐节点等待已终止以及定时通过将group属性设置为相同的值(group=agroup=b)来等待阻止

grouped nodes

它适用于等待 Teminated ,但对于定时等待已阻止效果不佳 - 可能因为这些节点之间有两条边。

您可以尝试通过选择链接它们的一条边并将其weight属性设置为较高值来将它们拉直。

除此之外,我认为图形看起来更好,因为边缘更平滑,曲线更少,特别是 - 但不仅仅是 - 在 Runnable 等待之间


意大利面条效果是由于花键 - 可能看起来不那么没有花键的意大利面?我尝试添加splines=compoundsplines=ortho(相同结果):

group and compound

图表使用的垂直空间略小。这不是意大利面,但在我看来并不是更好......


您也可以在没有组属性的情况下尝试splines=compound,这应该会使图形更紧凑(错误不一定更漂亮)。或者只是简单地利用边缘的重量来拉直特别令人不快的边缘。

在某些情况下,concentrate可以清除包含大量平行边的图形 - 在这种情况下它并没有真正帮助。