Как я могу сделать 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";];
. . .
}