如何在不引入重叠的情况下使DOT / neato图更紧凑?

13

我的问题与这个问题基本相同,但给出的答案对我不起作用。

这里是一个示例渲染(源代码)

compound=true;
overlap=scalexy;
splines=true;
layout=neato;

enter image description here

边缘存在一些不必要的重叠,但这并不算太糟糕,主要问题是所有空间都被浪费了。

我尝试设置 sep=-0.7;,结果如下图所示。

enter image description here

间距好多了,但现在与节点存在一些重叠。我尝试使用不同的 overlap 参数进行实验,但这是唯一一个可以提供稍微可接受结果的参数。

我曾尝试切换到 fdp 布局,并全局设置弹簧常数属性 K,但我只得到像这样子的东西:

enter image description here

源代码都很简单,就是一些类似 a--b--c 的东西,没有花哨的技巧。

我想让所有的边缘尽可能缩短(最小值为上限)前提是该调整不会引入任何新的重叠,而这就是 sep 完全失败的地方。这似乎对于一个布局引擎来说并不难。Graphviz 套件能否实现?我不介意更改渲染软件,但不想按节点或边缘逐个注释源码。

我的理想结果是最小化边长的偏差,以每个节点为单元考虑,即每个节点的边除必要的例外外都具有相等的长度,但这只是一厢情愿。首要任务是在不引入重叠的约束下减少每条边的长度。

我将接受部分解决方案,但它们必须是完全自动的和开源的。

如何实现?谢谢。


同样的问题。Neato似乎是我想要的布局,但它大多数情况下是不可配置的。 - Thomson Comer
3个回答

6

我发现了一个交互式工具https://sites.google.com/site/kuabus/programming-by-hu/graphviz-test-tool,可以对许多选项进行参数化并重复渲染。我查看了Java应用程序提供的完整列表,最终得出了这组属性:

overlap=false
maxiter=99999999
damping=9999999
voro_margin=.001
start=0.1
K=1
nodesep=999999999999
labelloc=c
defaultdist=9999999
size=20,20
sep=+1
normalize=99999999
labeljust=l
outputorder=nodesfirst
concentrate=true
mindist=2
fontsize=99999999
center=true
scale=.01
inputscale=99999999
levelsgap=9999999
epsilon=0.0001

我无法找到一个适当的neato参数化来产生所需的“适度缩放”的图形。


网站未找到。在资源|Graphviz页面上,它说该项目已被放弃。 - Ooker

1

您应该设置

overlap = compress;

这应该尽可能地压缩它。 首先尝试 sep = +1;,然后尝试在 0 和 +1 之间调整值,找到适合您的最佳设置。

它们都像疯了一样重叠在一起,即使我尝试使用大的sep值。 - spraff
你使用的K值是多少? - patapouf_ai
1
谢谢您的建议,我会尝试调整,但是作为一名程序员,我知道在不引入新的重叠情况的前提下缩短我已经拥有的稀疏无碰撞图像是可以通过算法实现的。恐怕这个答案看起来不太符合要求。 - spraff
不客气。是的,这绝对是可能的!它不应该重叠,这就是为什么我怀疑你的K值太小了。 - patapouf_ai
2
我和你一样 - 对于neato的大多数参数似乎根本没有任何影响。只有overlap,如果设置为true,则会导致所有内容都绘制在其上方,如果设置为其他任何值,则会导致所有内容在节点之间具有极长的边缘绘制。 - Thomson Comer
显示剩余4条评论

1

我有一个包含50个节点和68条边的图表(抱歉无法发布完整图片,只能提供一个片段)。发现了两个合理的预设方案(1和2):

digraph {
graph[
# 1. Less overlaps but less compact.
# This is the choice for now.
layout=neato; overlap=prism; overlap_scaling=-3.5; 

# 2. More compact but some overlaps exist (may be adjusted by `sep`).
#layout=neato; overlap=voronoi; sep=-0.15; 

# The following is common.
outputorder=nodesfirst, # Will always draw edges over nodes.
splines=curved;
]
node[fontname="Helvetica",];
node[shape=box;style="filled";penwidth="0.5";width=0;height=0;margin="0.05,0.05"];
edge[label=" ";color="#000080";penwidth="0.5";arrowhead="open";arrowsize="0.7";];
. . .
}

enter image description here


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