Предлагаемые инструменты для визуализации подграфа DAG - PullRequest
0 голосов
/ 04 августа 2020

Я пишу программу, которая в основном обрабатывает подграф DAG, т. Е. Граф является ориентированным ациклическим c графом, а каждый узел графа является подграфом. Например, для ребра A->B в группе DAG узел A является подграфом треугольника, а узел B - подграфом четырех клики. Ребро A->B указывает расширение от треугольника до четырех кликов путем добавления одной вершины подграфа и трех ребер подграфа.

 +=======+        +=======+
 | a---b |        | a---b |
 | |  /  |        | |\ /| |
 | | /   | =====> | | X | |
 | |/    |        | |/ \| |
 | c     |        | c---d |
 +=======+        +=======+
     A                B  

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

Я могу перечислить все узлы и ребра DAG и подграфы всех узлов в любом формате. Но я не знаю, какой инструмент лучше всего подходит для такой визуализации. Я попробовал graphviz , экспортировав DAG подграфа в формат dot и используя graphviz для преобразования файла dot в png. Проблема graphviz в том, что он может очень хорошо отображать подграф узлов, но не может показать структуру DAG в удобочитаемой форме. Было бы хорошо, если бы

  1. для края DAG A->B, узел A располагался над узлом B. (graphviz теперь помещает все узлы DAG в одну строку)
  2. узлы размещаются должным образом, так что пересечение между краями DAG минимизировано.

Есть ли другие альтернативы? Заранее спасибо!

1 Ответ

0 голосов
/ 05 августа 2020

Если я понимаю ваши требования, я думаю, что эта программа dot подходит довольно близко:

digraph dag {
  compound=true  // needed for A->B edge (kludge, but documented)
  edge [dir=none]  // no arrowheads
  subgraph clusterA{
   labelloc=b
   label="A"
   Aa -> Ab // [constraint=false]  // keep on same rank
   Ab -> Ac
   Aa -> Ac
   {
   rank=same
   Aa [label="a"]
   Ab [label="b"]
   }
   Ac [label="c"]
}
  subgraph clusterB{
   labelloc=b
   label="B"
   Ba -> Bb // [constraint=false]  // keep on same rank
   Bc -> Bd // [constraint=false]  // keep on same rank
   Bb -> Bc
   Ba -> Bc
   Bb -> Bd
   Ba -> Bd
   {
   rank=same
   Ba [label="a"]
   Bb [label="b"]
   }
   {
   rank=same
   Bc [label="c"]
   Bd [label="d"]
   }
}
Ac -> Ba [dir=forward ltail=clusterA lhead=clusterB  minlen=2] 
}

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

...