Блок-схема заказа в graphviz

#r #graphviz #diagrammer

#r #graphviz #составитель диаграмм

Вопрос:

График, который я хотел бы создать, представляет собой что-то вроде этой блок-схемы слева направо с основным процессом вверху и рядом группировок материалов ниже, которые вводятся и выводятся в разных точках, подобных этому: (хотя это фиктивный пример, и я хочу, чтобы в него поступало много материалаввод и вывод из верхнего блока кода, поэтому горизонтальный макет работает лучше, чем по умолчанию введите описание изображения здесь

Проблема в том, что это сделано в PowerPoint…

Я могу получить что-то близкое к этому:

 digraph example {
  
  graph [
    rankdir = LR
  ]
  
  subgraph cluster_code {
    label = "code";
    A;
    B;
    C;
    D;
  }

  subgraph cluster_data {
    label = "data";
    data_1;
    data_2;
  }
  
  subgraph cluster_source {
    label = "source"
    source_1;
    source_2
  }
  
   A -> B
   B -> C
   C -> D
  
  data_1 -> A
  data_2 -> B
  A -> output_1
  output_1 -> C
  
  source_1 -> data_1
  source_2 -> data_2
  
  #{rank = same; source_2; data_2; A}
  
}
 

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

Но если я попытаюсь поместить source data кластеры and под кластером кода, используя {rank = same; source_2; data_2; A} (это хэшировано выше, и я не повторяю весь код для краткости сообщения), я тогда A data_2 и source_2 выпадаю из коробки. Я думаю, что это связано с тем, что ранг и кластеры плохо сочетаются друг с другом.

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

Есть какие-либо намеки на получение чего-то вроде первого графика выше?

Я запускаю graphviz через R / Rstudio и DiagrammeR .

Ответ №1:

Похоже, что вы хотите изменить «rankdir» в середине графика. Вполне разумно, но Graphviz ее не поддерживает. Вот ваш график, использующий rankdir по умолчанию и не очень хорошо документированную возможность эффективного изменения rankdir с помощью rank=same в подграфе. Это также меняет направление острия стрелки на противоположное — ошибка, но это работает.

 digraph example {
  node [width=1.5]

  subgraph cluster_code {
    label = "code";
    {rank=same 
    A -> B -> C -> D    
    }
  }

  subgraph cluster_data {
    label = "data";
    data_1;
    data_2;
  }
  
  subgraph cluster_source {
    label = "source"
    source_1;
    source_2
  }
  
  A -> output_1
  output_1 -> C
  
  edge[dir=back minlen=2]  // minlen makes (rank) space
  A -> data_1  // -> A
  A -> data_2  // -> A
  
  edge[dir=back minlen=1]
  data_1 -> source_1 // -> data_1
  data_2 -> source_2 // -> data_2
}
 

Предоставление этого:
введите описание изображения здесь

Комментарии:

1. это должно направлять стрелки назад, отчего у меня кружится голова, но также имеет смысл в том, как вы играете с механизмом — отличное решение