Как управлять расположением подграфов в точке?

i имеет digraph, состоящий из многих независимых и простых subgraphs различных размеров. dot устанавливает все эти подграфы горизонтально, поэтому я получаю выходной файл 40000x200, например:

G1 G2 G3 G.....4 G5

Как я могу сказать dot для компоновки этих подграфов в обоих измерениях, чтобы получить что-то вроде:

G1 G2 G3
G.....4
G5

Спасибо.

Ответ 1

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

Следующая строка представляет собой возможную конфигурацию, graph.dot является файлом, который содержит ваш график (ы). Возможно, вам придется играть с вариантами.

ccomps -x graph.dot | dot | gvpack -array3 | neato -Tpng -n2 -o graph.png

И вот объяснение:


1. Отдельные отключенные графики

Инструмент: ccomps

разлагает графики на свои компоненты связности

Опция -x (только отдельные компоненты подключены, как отдельные графики), вероятно, все, что необходимо.


2. Макет каждого графика

Инструмент: точка

Каждый направленный граф выкладывается один за другим. Этот шаг необходим, чтобы получить положение узлов и ребер.


3. Упакуйте все выложенные графики в один

Инструмент: gvpack

читает в потоке графов, объединяет графики в один макет, и создает единый граф, служащий объединением входных графов.

Вы должны прочитать документацию по параметрам для этого инструмента и играть с параметрами. Например, -array используется для выкладки графиков в виде сетки, а также предлагает несколько флагов для управления макетом.


4. Создайте вывод

Инструмент: neato

Опция -n2 указывает neato не размещать входные графики, а использовать существующие атрибуты позиции.


Пример графика:

graphiz gvpack

digraph G {
 subgraph G1 {
    a->{b; c;};
 }
 subgraph G2 {
    d -> {e; f;};
 }
 subgraph G3 {
    g -> h;
 }
 subgraph G4 {
    i -> j;
 }
 subgraph G5 {
    {k; l;} -> m;
 }
}

Изменить: Сортировка орграфов в gvpack

Чтобы определить порядок появления подграфов в объединенной компоновке, созданной gvpack, каждому подграфу потребуется атрибут sortv.

Например, следующие графики:

digraph G1 {
 sortv=1;
 a->{b; c;};
}
digraph G2 {
 sortv=2;
 d -> {e; f;};
}
digraph G3 {
 sortv=3;
 g -> h;
}
digraph G4 {
 sortv=4;
 i -> j;
}
digraph G5 {
 sortv=5;
 {k; l;} -> m;
}

можно преобразовать, используя

dot graph.dot | gvpack -array_u | neato -Tpng -n2 -o graph.png

в результате чего

packed graph with ordered subgraphs