Как контролировать расположение подграфов в точке? - PullRequest
30 голосов
/ 04 ноября 2011

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

G1 G2 G3 G.....4 G5

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

G1 G2 G3
G.....4
G5

Спасибо.

1 Ответ

50 голосов
/ 04 ноября 2011

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

Следующая строка является возможной конфигурацией, 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

...