#graphviz #pygraphviz
#graphviz #pygraphviz
Вопрос:
Я пытаюсь настроить следующий график так, чтобы ‘old_view’ и ‘new_views’ находились в одном и том же ранге вверху, а ‘old_submits’ и ‘new_sub’ находились в одном и том же ранге внизу. ‘Continues’ будет располагаться между двумя строками.
Я пытался использовать подграфы, как предлагали другие, но это не помогло мне в этом.
c=Digraph('parent')
c.attr('graph', label='')
c.attr('node',fontname='helvetica')
c.attr('graph',fontname='helvetica')
c.attr('edge',fontname='helvetica')
c.attr('node', shape='box', color='lightgrey')
c.attr(rank='same')
c.node('old_views')
c.node('new_views')
c.node('continues')
g=Digraph('subgraph')
g.graph_attr.update(rank='same')
g.node('new_submits')
g.node('old_submits')
c.edge('new_views','continues')
c.edge('continues','new_submits')
c.edge('old_views','old_submits')
c.subgraph(g)
c
Пример изображения:
Ответ №1:
Чистый graphviz
намек на то, что вы должны быть в состоянии легко перейти на python:
Если вы хотите «пропустить» уровень, у вас есть две возможности (как минимум):
Вы можете использовать пустой узел — недостатком является то, что вам нужно определить этот пустой узел b
, и что ваше ребро, указывающее от a
до b
, не должно иметь наконечника стрелки. Кроме того, если вы внимательно посмотрите, вы увидите пустой пиксель на пути от a
к c
.
Последнего вы можете избежать, направив дополнительное невидимое ребро от A
over E
к C
, создавая не только необходимость в этом дополнительном ребре, но и для увеличения веса D -> E -> E
ребра, чтобы оно оставалось прямым.
digraph so
{
b[ shape = point, width = 0]
a -> b[ dir = none ];
b -> c;
d -> e -> f;
A -> C;
A -> E -> C[ style = invis ];
D -> E -> F[ weight = 10 ];
}
Выбор за вами!