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

时间:2015-01-03 13:26:53

标签: dot neato

我的问题与this one基本相同,但给出的答案对我没有用。

以下是使用

呈现(source)的示例
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种东西,没有花哨的技巧。

我想要的是尽可能缩短所有边缘(最多),前提是此调整不会引入任何新的重叠,这是{{1完全失败了。对于布局引擎来说,这似乎不会太难。是否可以使用graphviz套件?我不介意更改渲染软件,但我不想在每个节点或每个边缘基础上注释源。

我的理想结果将最小化边长的偏差,一次被认为是一个节点,即每个节点除了必要的例外之外将具有相等长度的边,但是'一厢情愿。优先级是减少每条边的长度,但不能引入重叠。

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

我该怎么做?感谢。

3 个答案:

答案 0 :(得分:2)

我找到了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的参数化,这使得生成所需的“适度缩放”图形成为可能。

答案 1 :(得分:1)

你应该设置

overlap = compress;

这应该尽可能地压缩它。 试试sep = +1;首先,然后使用0到+1之间的值进行播放,以便为您找到最佳设置。

答案 2 :(得分: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