Kon*_*che 9 graph dot graphviz
我使用以下代码编译以下图表dot graph.dot -Tpdf -ograph.pdf:

结果还可以,但状态转换看起来很像一个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" ]
}
Run Code Online (Sandbox Code Playgroud)
我不认为你的设计存在缺陷,我认为没关系.点语法是可读的,因此是可维护的,结果是自动生成的图形看起来通常相似.
当然,您可以添加小的更正,以使这个特定的图更好(或至少不同).如果例如图表的源由应用程序生成,则其中一些可能难以实现.以下是一些想法:
要使布局更加对称,您可以尝试通过将其属性设置为相同的值(和)来对齐等待和终止节点以及定时等待和阻止.groupgroup=agroup=b

它适用于Waiting和Teminated,但对于Timed Waiting和Blocked效果不佳- 可能是因为这些节点之间有两条边.
您可以尝试通过选择链接它们的一条边并将其weight属性设置为高值来将它们拉直.
除此之外,我认为图形看起来更好,因为边缘更平滑并且具有更少的不必要的曲线,尤其是 - 但不仅仅是 - 在Runnable和Waiting之间.
在意大利面条效应是由于花键-也许它看起来不太面条没有花键?我尝试添加splines=compound或splines=ortho(相同的结果):

该图使用的垂直空间略小.这不是意大利面,但在我看来并不是更好......
您也可以尝试splines=compound没有组属性,这应该使图形更紧凑(错误不一定更漂亮).或者只是简单地利用边缘的重量来拉直特别令人不快的边缘.
在某些情况下,concentrate可以清除具有大量平行边的图形 - 在这种情况下,它并没有真正帮助.