Размещение узла GraphViz и Rankdir

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

http://en.wikipedia.org/wiki/File:ICS_Structure.PNG

настолько искренне, насколько я могу. Нижняя часть этого графика идет сверху вниз, и у меня все работает нормально. Чего мне не удалось сделать, так это разместить первых трех детей прямо под «Командиром инцидентов». Они разветвляются влево и вправо. Плюс обратите внимание на то, как разделяются ребра в 8 верхних узлах. Это возможно с точкой? Я могу справиться со всем остальным, но не с этими верхними узлами. Может кто-нибудь подскажет, как это решить?


person simusid    schedule 10.09.2011    source источник


Ответы (2)


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

  • Невидимые узлы
  • Ограничения ранга

Вот быстрая попытка для верхних узлов:

digraph g{
ranksep=0.2;

node[shape=box3d, width=2.3, height=0.6, fontname="Arial"];
n1[label="Incident Commander"];
n2[label="Public Information\nOfficer"];
n3[label="Liaison Officer"];
n4[label="Safety Officer"];
n5[label="Operations Section"];
n6[label="Planning Section"];
n7[label="Logistics Section"];
n8[label="Finance/Admin. Section"];

node[shape=none, width=0, height=0, label=""];
edge[dir=none];
n1 -> p1 -> p2 -> p3;
{rank=same; n2 -> p1 -> n3;}
{rank=same; n4 -> p2;}
{rank=same; p4 -> p5 -> p3 -> p6 -> p7;}
p4 -> n5;
p5 -> n6;
p6 -> n7;
p7 -> n8;
}

И вот результат:

верхние узлы точечного макета

person marapet    schedule 10.09.2011
comment
Я рада, что это помогает! (Поскольку это ваш первый вопрос: не забудьте проголосовать / принять, если это именно то, что вы искали.) Причина, по которой вы не найдете много таких макетов, заключается в том, что graphviz на самом деле не идеальный инструмент для создания таких диаграммы - если вам нужен 100% контроль над макетом, возможно, проще использовать какую-нибудь программу wysiwyg. - person marapet; 11.09.2011
comment
Где определены p1, p2, p3, ..? Я что-то упускаю? - person HeyWatchThis; 16.10.2013
comment
@HeyWatchThis Нет необходимости явно определять каждый узел - узел определяется при первом появлении. Как видите, я сначала определяю видимые узлы, а затем устанавливаю атрибуты узлов по умолчанию (node[shape=none, ...]) для всех узлов, которые будут определены после этого момента. Поскольку все узлы p появляются после этой строки, все они имеют shape=none. - person marapet; 16.10.2013
comment
Хорошо, круто, я подумал, что это может быть специальный точечный синтаксис для точечных узлов, как и для кластеров, начинающихся со слова cluster. Но да, это умный способ создать нужный макет, круто. - person HeyWatchThis; 18.10.2013
comment
@marapet, а разве невидимые дополнительные узлы не вроде какая-то уродина? - person Pacerier; 17.07.2014
comment
@Pacerier Да, я согласен, и поэтому я заявил в предыдущем комментарии, что graphviz - не самый подходящий инструмент для воссоздания существующих макетов. Но если кто-то хочет это сделать, это один из известных мне подходов, который позволяет это сделать (в большинстве случаев «splines = ortho» недостаточно). Если вы знаете более эффективные или альтернативные методы, опубликуйте их, и я буду за них проголосовать. - person marapet; 17.07.2014

Собственный рендеринг Graphviz (точечный) не поддерживает стиль рендеринга органограммы, использованный в оригинале. Хотя он может генерировать ортогональные ребра (как показано), нет способа автоматизировать группировку ребер. Вертикальное наслоение может быть достигнуто с помощью minlen.

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

плохой рендеринг ICS

В поставляемое решение внесены следующие изменения:

graph [splines=ortho]; edge [dir = none];

{ rank = same; n2; n3; }
n1 -> { n2; n3; };
n1 -> n4 [minlen = 2];
{ rank = same; n5; n6; n7; n8; };
n1 -> { n5; n6; n7; n8; } [minlen = 3];
person Pekka    schedule 10.08.2016