Позиции узлов в Graphviz

#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 ];
}
  

Выбор за вами!

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