#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. это должно направлять стрелки назад, отчего у меня кружится голова, но также имеет смысл в том, как вы играете с механизмом — отличное решение