Как сделать диаграммы DOT/neato более компактными, не вводя перекрытие?

Мой вопрос по существу такой же, как этот, но данный ответ не работает для меня.

Вот пример рендеринга (источник) с помощью

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

enter image description here

В ребрах есть ненужное перекрытие, но это не так уж плохо, основная проблема - это все потерянное пространство.

Я попытался установить sep=-0.7; и вот что происходит.

enter image description here

Интервал намного лучше, но теперь есть несколько совпадений с узлами. Я экспериментировал с различными параметрами overlap, и это единственное, что дает отдаленно приемлемые результаты.

Я попытался перейти на макет fdp и установить атрибут spring константы K по всему миру, но я просто получил такие вещи:

enter image description here

Источник - все просто a--b--c что-то типа, никаких причудливых трюков.

Я хочу, чтобы все ребра были как можно более сокращены (до минимума) при условии, что эта настройка не вносит никаких новых перекрытий, где sep завершается полностью, Кажется, это не слишком сложно для механизма компоновки. Возможно ли это с пакетом graphviz? Я не против изменения программного обеспечения рендеринга, но я не хочу комментировать источник на основе node или per-edge.

Моим идеальным результатом было бы минимизировать отклонение длины ребра, считая один node за раз, т.е. каждый node имел бы края равной длины, кроме необходимых исключений, но это принятие желаемого за действительное. Приоритет состоит в том, чтобы уменьшить длину каждого ребра с ограничением, что это не может привести к перекрытию.

Я принимаю частичные решения, но они должны быть полностью автоматическими и с открытым исходным кодом.

Как я могу это сделать? Спасибо.

Ответ 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, чтобы найти оптимальную настройку для вас.