Как я могу сделать DOT/ Neato-графы более компактными без наложения?

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

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

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

введите описание изображения здесь

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

Я пробовал настройку sep=-0.7; и вот что происходит.

введите описание изображения здесь

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

Я попытался изменить макет FDP и установить атрибут константы пружины K глобально, но я только что получил такие вещи:

введите описание изображения здесь

Источник все просто a--b--c такие вещи, никаких хитростей.

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

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

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

Как я могу это сделать? Благодарю.

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 это позволило создать желаемый "умеренно масштабированный" график.

Вы должны установить

overlap = compress;

это должно сжать это в максимально возможной степени. Попробуй sep = +1; сначала, а затем поиграйте со значениями от 0 до +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";];
. . .
}

Другие вопросы по тегам