我使用: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" ]
}
答案 0 :(得分:7)
我不认为你的设计存在缺陷,我认为没关系。点语法是可读的,因此是可维护的,结果是自动生成的图形看起来很相似。
当然,您可以添加小的更正,以使此特定图表更好(或至少不同)。如果例如图表的源由应用程序生成,则其中一些可能难以实现。以下是一些想法:
要使布局更对称,您可以尝试对齐节点等待和已终止以及定时通过将group
属性设置为相同的值(group=a
和group=b
)来等待和阻止。
它适用于等待和 Teminated ,但对于定时等待和已阻止效果不佳 - 可能因为这些节点之间有两条边。
您可以尝试通过选择链接它们的一条边并将其weight
属性设置为较高值来将它们拉直。
除此之外,我认为图形看起来更好,因为边缘更平滑,曲线更少,特别是 - 但不仅仅是 - 在 Runnable 和等待之间
意大利面条效果是由于花键 - 可能看起来不那么没有花键的意大利面?我尝试添加splines=compound
或splines=ortho
(相同结果):
图表使用的垂直空间略小。这不是意大利面,但在我看来并不是更好......
您也可以在没有组属性的情况下尝试splines=compound
,这应该会使图形更紧凑(错误不一定更漂亮)。或者只是简单地利用边缘的重量来拉直特别令人不快的边缘。
在某些情况下,concentrate
可以清除包含大量平行边的图形 - 在这种情况下它并没有真正帮助。