Graphviz - как разметить самообращающиеся ребра, чтобы избежать визуального беспорядка? - PullRequest
0 голосов
/ 17 января 2020

У меня есть график, где экземпляры объектов иногда называют себя. При этом используется механизм компоновки dot .

digraph G {

  foo;

  foo -> foo [label="msg1"];
  foo -> foo [label="msg2"];
  foo -> foo [label="msg3"];

}

Это создает некоторую путаницу в визуализированном графике, поскольку все они оказываются в одном месте.

enter image description here

Какой самый простой / лучший способ их немного разнести? Я полагаю, что грубый метод заключается в добавлении скрытых узлов n1, n2, n3, а затем foo -> n1; n1->foo; foo -> n2;...

Я, вероятно, смотрю порядка 7-8 самоссылающихся сообщений на узел, максимум, но решение для 3 -4 было бы хорошим началом.

онлайн просмотрщик / редактор

Это удар по подходу скрытых узлов. Не очень хорошо. Удаление атрибута label на невидимых узлах по-прежнему оставляло зазор между стрелками.

digraph G {

  foo;
  foo -> n1 [label="msg1" dir="none"];
  n1 -> foo;
  foo -> n2 [label="msg2" dir="none"];
  n2 -> foo;
  foo -> n3 [label="msg3" dir="none"];
  n3 -> foo;
  n1 [ label = "", style = invis ];
  n2 [ label = "", style = invis ];
  n3 [ label = "", style = invis ];
}

enter image description here

Лучшее, что мне удалось до сих пор (фактическое преимущество метки довольно длинные, поэтому я добавил это, чтобы увидеть результаты), используя n1, n2, n3 промежуточные узлы, не скрытые, но используя shape="plaintext":


digraph G {


  foo;
  foo -> n1 [dir="none"];
  n1 -> foo;
  foo -> n2 [dir="none"];
  n2 -> foo;
  foo -> n3 [dir="none"];
  n3 -> foo;
  n1 [ shape="plaintext" label="msg111111111111111111111111111"];
  n2 [ shape="plaintext" label="msg222222222222222222222222222" ];
  n3 [ shape="plaintext" label="msg333333333333333333333333333" ];

}

, что дает:

enter image description here

Редактировать: Поиск ответов, относящихся к точка , поскольку я иногда передаю DOT специализированным библиотекам рендеринга, таким как d3-graphviz , я знаю, что работает с dot , не уверен насчет других механизмов компоновки.

1 Ответ

1 голос
/ 25 января 2020

Попробуйте это с точка или neato

digraph G {
  graph [center=true pad=.5]

 subgraph clustera {
  // neato seems to ignore margin!
  graph [margin=70 style=dotted] // change dotted to invis for finished graph
  graph [nodesep=.3] // neato, not dot
  // edge[labelangle=0 labeldistance=4] // minlen=.7]

  foo [height=.8 width=1.4 shape=circle];

  foo -> foo [tailport=n  headport=n    taillabel="msg1"];
  foo -> foo [tailport=ne  headport=ne  taillabel="msg1a"];
  foo -> foo [tailport=e  headport=e    taillabel="msg2"];
  foo -> foo [tailport=se  headport=se  taillabel="msg2a"];
  foo -> foo [tailport=s  headport=s    taillabel="msg3"];
  foo -> foo [tailport=sw  headport=sw  taillabel="msg3a"];
  foo -> foo [tailport=w  headport=w    taillabel="msg4"];
  foo -> foo [tailport=nw  headport=nw  taillabel="msg4a"];
 }
}  

точка результата

...