Graph 收紧点图,使其更加对称

Graph 收紧点图,使其更加对称,graph,graphviz,dot,Graph,Graphviz,Dot,我使用:dot-graph.dot-Tpdf-ograph.pdf编译以下图表,生成: 结果是好的,但是状态转换看起来很像一个Spagethi怪物,我不知道我能做些什么来解决这个问题。我尝试了其他布局:twopi、neato等。是否有参数允许它强制图形看起来更对称一些?因为整体情况还可以 对我来说,边缘似乎使用了最小的可用空间来构建边缘描述,也许这就是问题所在 我的图形设计有缺陷吗?我应该在一条边上写入不同的状态转换,使用\n分隔不同的转换吗 digraph finite_state_mach

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

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

对我来说,边缘似乎使用了最小的可用空间来构建边缘描述,也许这就是问题所在

我的图形设计有缺陷吗?我应该在一条边上写入不同的状态转换,使用\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" ]
}

我不认为你的设计有缺陷,我认为没关系。点语法是可读的,因此是可维护的,其结果就是自动生成的图形的典型外观

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


要使布局更加对称,您可以尝试将等待和终止的节点以及定时等待和阻止的节点的属性设置为相同的值(
group=a
group=b

它在等待和终止时工作得很好,但在定时等待和阻塞时效果不太好——可能是因为这些节点之间有两条边

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

除此之外,我认为图形总体上看起来更好,因为边缘更平滑,不必要的曲线更少,尤其是在可运行和等待之间


意大利面效果是由样条线造成的-如果没有样条线,它看起来可能不那么意大利面?我尝试添加
spline=composite
spline=ortho
(结果相同):

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


您也可以尝试在不使用group属性的情况下使用
spline=component
,这将使图形更紧凑(bug不一定更漂亮)。或者简单地利用边缘的重量来拉直特别不舒服的边缘


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

这非常有用,谢谢。我想这是你能得到的最好的了。重量和组似乎是真正的交易!