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

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

G1 G2 G3 G.....4 G5

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

G1 G2 G3
G.....4
G5

Спасибо.


person Benoît    schedule 03.11.2011    source источник


Ответы (1)


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

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

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

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


1. Отдельные несвязные графы

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

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

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


2. Разметьте каждый график

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

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


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

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

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

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


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

Инструмент: чистый

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


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

графический 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

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

упакованный граф с упорядоченными подграфами

person marapet    schedule 04.11.2011
comment
Спасибо. ccomps на самом деле просто переписывает мои подграфы в орграфы. Настоящую работу выполняет gvpack. - person Benoît; 04.11.2011
comment
Есть ли способ отсортировать орграфы тогда? - person Benoît; 04.11.2011
comment
Да, ccomps разделяет несвязанные графы. Если вам это не нужно, вы можете создать отдельные графики с самого начала. Вы можете добавить атрибут sortv к каждому (под)графу. Флаг u указывает, что порядок вставки основан на атрибуте sortv, прикрепленном к каждому графику. — поэтому использование gvpack -array_u3 должно упорядочивать внешний вид графиков по значению их атрибута sortv. - person marapet; 05.11.2011