【问题标题】:How can I make DOT/neato graphs more compact without introducing overlap?如何在不引入重叠的情况下使 DOT/neato 图更紧凑?
【发布时间】:2015-03-01 13:32:49
【问题描述】:

我的问题与this one 基本相同,但给定的答案对我不起作用。

这是一个示例渲染(source)

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

边缘有一些不必要的重叠,但这还不错,主要问题是所有浪费的空间。

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

间距要好得多,但现在与节点有一些重叠。我尝试了不同的overlap 参数,这是唯一一个可以提供远程可接受结果的参数。

我尝试更改为 fdp 布局并全局设置弹簧常量属性K,但我得到了这样的东西:

来源都是简单的a--b--c 之类的东西,没有花哨的技巧。

我想要的是尽可能缩短所有边缘(最多)只要这种调整不会引入任何新的重叠,这就是 sep 完全失败的地方.对于布局引擎来说,这似乎并不难。 graphviz套件可以吗?我不介意更改渲染软件,但我不想在每个节点或每个边缘的基础上注释源。

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

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

我该怎么做?谢谢。

【问题讨论】:

  • 同样的问题。 Neato 似乎是我想要的布局,但它大多无法配置。

标签: dot neato


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你应该设置

    overlap = compress;
    

    这应该尽可能地压缩它。 试试 sep = +1;首先,然后使用 0 到 +1 之间的值来找到最适合您的设置。

    【讨论】:

    • 它们都像疯了一样重叠,即使我为sep尝试较大的值。
    • 你使用的 K 值是多少?
    • 尝试保持 sep=1;但减少弹簧强度。所以尝试 K=0.3(默认值),然后逐渐增加该值。
    • 感谢您的建议,我会修改,但我的程序员知道缩短我已经拥有的稀疏无碰撞图像而不引入新的重叠在算法上是可能的。恐怕这个答案看起来不合格。
    • 我在同一条船上-neato 的大多数参数似乎根本没有效果。只有overlap,如果true 导致所有内容都在其上绘制,如果设置为任何其他值,则会导致在节点之间以极长的边绘制所有内容。
    【解决方案3】:

    我有一个有 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";];
    . . .
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多