Блок-схема DiagrammeR: выравнивание вертикальных узлов

Я использую пакет DiagrammeR R для рисования блок-схемы, и ниже приведен код, используемый для создания фиктивного примера:

library(DiagrammeR)
grViz("digraph flowchart {

  # node type 1: starting and ending node
  node [fontname = Helvetica, shape = oval]
  start [label = '@@1']
  node [fontname = Helvetica, shape = oval]
  pro2 [label = '@@6']

  # node type 2: decision
  node [fontname = Helvetica, shape = diamond]
  dec1 [label = '@@2']
  dec2 [label = '@@3']
  node [fontname = Helvetica, shape = diamond]
  dec3 [label = '@@4']

  # node type 3: process 
  node [fontname = Helvetica, shape = rectangle]
  pro1 [label = '@@5']
  node [fontname = Helvetica, shape = rectangle]        
  pro3 [label = '@@7']
  
  # specify which nodes are of the same 'rank' so that they'll be drawn at the same level
  {rank = same; dec2 pro3}
  {rank = same; pro1 dec3}
  
  # edge definitions with the node IDs
  edge[tailclip = true, headclip = true];
  start -> dec1
  dec1 -> dec2 [fontname = Helvetica, label = '', headport = 'n', tailport = 's']
  dec1 -> pro3 [fontname = Helvetica, label = '', headport = 'n', tailport = 'e']
  dec2 -> pro1 [fontname = Helvetica, label = '', tailport = 's']
  dec2 -> pro3 [fontname = Helvetica, label = '']
  pro3 -> dec3 [fontname = Helvetica, label = '', headport = 'n']
  dec3 -> pro2 [fontname = Helvetica, label = '', headport = 'n', tailport = 's']
  dec3 -> pro3 [fontname = Helvetica, label = '', headport = 'e', tailport = 'e']
  pro1 -> dec1 [fontname = Helvetica, label = '', headport = 'w']
  }

  [1]: 'START'
  [2]: 'decision 1'
  [3]: 'decision 2'
  [4]: 'decision 3'
  [5]: 'process 1'
  [6]: 'END'
  [7]: 'process 3'
  ")

Созданная блок-схема выглядит так: Я надеюсь, что

  • процесс 1 можно выровнять по вертикали, как СТАРТ, решение 1 и решение 2 выше (в настоящее время он расположен слева, что выглядит неуклюже; также стрелка от решения 2 к процессу 1 должна быть прямой, а не изогнутой...
  • решение 3 и END можно выровнять по вертикали, как процесс 3 выше; также стрелка от процесса 3 к решению 3 должна быть прямой, а не изогнутой...
  • Хорошо иметь, но не обязательно: есть ли способ превратить изогнутую стрелку в прямую стрелку? Например, я надеюсь, что конец стрелки будет начинаться с западной стороны процесса 1, немного выпрямляться по горизонтали, а затем прямо вертикально до того же уровня, что и решение 1, и, наконец, прямо горизонтально, чтобы указывать на западную сторону решения 1...

Спасибо за помощь!

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


person alittleboy    schedule 30.12.2020    source источник
comment
Для 1 и 2 добавление {rankdir='TB'; start -> dec1 -> dec2 -> pro1}; {rankdir='TB'; pro3 -> dec3 -> pro2}; делает то, что вы хотите (вам нужно будет удалить другие ребра). В отношении 3 вам, вероятно, нужно добавить фиктивный/невидимый узел (это условия поиска)   -  person user20650    schedule 30.12.2020
comment
ре 3; stackoverflow.com/questions/7115870/ приводит пример.   -  person user20650    schedule 30.12.2020