加强点图,使其更对称。

11
我使用命令 dot graph.dot -Tpdf -ograph.pdf 生成以下图形:

enter image description here

结果还行,但状态转移看起来像一条意大利面条,我不知道该怎么解决这个问题。我尝试了其他布局: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个回答

9
我认为你的设计并不有缺陷,我认为它还可以。点语法易读且易于维护,结果通常是自动生成图形的样子。
当然,你可以进行一些小的修改,以使这个特定的图形更好(或者至少不同)。如果例如你的图形源由应用程序生成,则其中一些可能难以实现。以下是一些想法:
为了使布局更对称,您可以尝试通过将节点等待终止以及定时等待阻塞group属性设置为相同的值(group=agroup=b)来对齐它们。

grouped nodes

它对于“等待”和“终止”运行良好,但对于“定时等待”和“阻塞”则不太好 - 这可能是因为这些节点之间有两个边。
您可以通过选择连接它们的边之一并将其weight属性设置为高值来尝试拉直它们。
除此之外,我认为整个图形看起来更加美观,因为边缘更加平滑且不必要的曲线更少,特别是在“可运行”和“等待”之间。
“意大利面效应”是由样条线引起的 - 没有样条线可能会看起来不那么像意大利面? 我尝试通过添加splines = compoundsplines = ortho(结果相同)来改善它:

group and compound

这个图表使用的垂直空间稍微少一些。它不像意大利面条那样混乱,但在我看来也没有更好...


你也可以尝试不使用组属性而使用splines=compound,这样可以使图形更加紧凑(但不一定更美观)。或者仅仅调整边缘的权重以拉直特别难看的边缘。
在某些情况下,concentrate 可以清除具有大量平行边的图形-但在这种情况下,它并没有真正帮助。

这非常有帮助,谢谢。我认为这是你能得到的最好的东西。权重和分组似乎是真正的解决方案! - Konrad Reiche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接