У меня есть график, где экземпляры объектов иногда называют себя. При этом используется механизм компоновки dot .
digraph G {
foo;
foo -> foo [label="msg1"];
foo -> foo [label="msg2"];
foo -> foo [label="msg3"];
}
Это создает некоторую путаницу в визуализированном графике, поскольку все они оказываются в одном месте.
Какой самый простой / лучший способ их немного разнести? Я полагаю, что грубый метод заключается в добавлении скрытых узлов 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 ];
}
Лучшее, что мне удалось до сих пор (фактическое преимущество метки довольно длинные, поэтому я добавил это, чтобы увидеть результаты), используя 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" ];
}
, что дает:
Редактировать: Поиск ответов, относящихся к точка , поскольку я иногда передаю DOT специализированным библиотекам рендеринга, таким как d3-graphviz , я знаю, что работает с dot , не уверен насчет других механизмов компоновки.