Как создать ребро от узла до подграфа в Graphviz Dot?
Я хочу создать график, который выглядит так, я. е. где ребро выходит из узла Manufacturer of means of production
в подграф с тем же именем.
я написал для этого следующий код:
digraph G {
rankdir=LR;
compound=true;
graph [fontname="Liberation Mono"];
node [fontname="Liberation Mono"];
edge [fontname="Liberation Mono"];
subgraph cluster0 {
label="System components";
mmp [label="Manufacturer of means of production", shape=box];
}
subgraph cluster1 {
t1start [label="Start of tact 1", shape=point]
t1end [label="End of tact 1", shape=point ]
subgraph cluster1_mmp {
label="Manufacturer of means of production"
cluster1_1 [label="Node 1", color=white]
subgraph cluster1_1_1 {
label="Technological cycle 1"
cluster1_1_1 [label="Node 2", color=white]
}
subgraph cluster1_1_2 {
label="Technological cycle 2"
cluster1_1_2 [label="Node 2", color=white]
}
}
}
subgraph cluster2 {
label="Такт 2"
t2start [label="Start of tact 2", shape=point]
t2end [label="End of tact 2", shape=point]
}
t1end -> t2start
mmp -> cluster1_1 [ltail=cluster1_mmp];
}
если я попытаюсь скомпилировать этот код ("C:Program Files (x86)Graphviz2.38bin"dot.exe -Tpng -ograph.png graph.dot
), Я получаю предупреждение Warning: mmp -> cluster1_1: tail not inside tail cluster cluster1_mmp
.
как я могу это исправить и заставить край перейти к подграфу?
обновление 1:
ниже вы можете найти изображение ожидаемого результата-ребро, которое переходит от узла к подграфу (подграф, а не узел внутри подграфа). Этот край красный на изображении ниже.
обновление 2: изменил код, как показано ниже.
digraph G {
rankdir=LR;
compound=true;
graph [fontname="Liberation Mono"];
node [fontname="Liberation Mono"];
edge [fontname="Liberation Mono"];
subgraph cluster0 {
label="System components";
mmp [label="Manufacturer of means of production", shape=box];
}
subgraph cluster1 {
t1start [label="Start of tact 1", shape=point]
t1end [label="End of tact 1", shape=point ]
subgraph cluster1_mmp {
label="Manufacturer of means of production"
testNode [label="Node 1", color=white]
subgraph cluster1_1_1 {
label="Technological cycle 1"
cluster1_1_1 [label="Node 2", color=white]
}
subgraph cluster1_1_2 {
label="Technological cycle 2"
cluster1_1_2 [label="Node 2", color=white]
}
}
}
subgraph cluster2 {
label="Такт 2"
t2start [label="Start of tact 2", shape=point]
t2end [label="End of tact 2", shape=point]
}
t1end -> t2start
mmp -> cluster1 [ltail=cluster0, lhead=cluster1, label=" "];
}
2 ответов
вам нужно изменить последнюю строку
mmp -> cluster1_1 [ltail=cluster1_mmp];
до
mmp -> cluster1_1 [lhead=cluster1 label=" "]
и затем график приходит, как ожидалось
также, если вы хотите, чтобы край начинался вне коробки, вы бы сделали
mmp -> cluster1_1 [ltail=cluster0 lhead=cluster1 label=" "];
редактировать
финальный код
digraph G {
rankdir=LR;
compound=true;
graph [fontname="Liberation Mono"];
node [fontname="Liberation Mono"];
edge [fontname="Liberation Mono"];
subgraph cluster0 {
label="System components";
mmp [label="Manufacturer of means of production", shape=box];
}
subgraph cluster1 {
t1start [label="Start of tact 1", shape=point]
t1end [label="End of tact 1", shape=point ]
subgraph cluster1_mmp {
label="Manufacturer of means of production"
cluster1_1 [label="Node 1", color=white]
subgraph cluster1_1_1 {
label="Technological cycle 1"
cluster1_1_1 [label="Node 2", color=white]
}
subgraph cluster1_1_2 {
label="Technological cycle 2"
cluster1_1_2 [label="Node 2", color=white]
}
}
}
subgraph cluster2 {
label="Такт 2"
t2start [label="Start of tact 2", shape=point]
t2end [label="End of tact 2", shape=point]
}
t1end -> t2start
mmp -> cluster1_1 [lhead=cluster1 label=" "]
}
скрипка ссылке для же
Urm, вы просто имели в виду" lhead=cluster1_mmp", а не ltail?
ваш край указан как:
mmp -> cluster1_1 [ltail=cluster1_mmp];
сообщение об ошибке у вас есть "предупреждение: mmp - > cluster1_1: хвост не внутри хвостового кластера cluster1_mmp"
Это говорит о том, что ваш хвост не находится внутри хвостового кластера. Хвост кластера cluster1_mmp. cluster1_1, что вы пытаетесь подключиться к определенно внутри cluster1_mmp. Это объясняет ваше замешательство.
только после долгих исследований с GraphvizFiddle я в конце концов вспомнил, что со стрелкой заостренный конец-это глава (то есть, синтаксис tail -> head
).
Так, cluster1_1, узел вы пытаетесь говорит в cluster1_mmp является руководителем стрелки. Вот почему ваша спецификация ltail не работает. Изменение его на lhead избавляется от сообщения об ошибке и генерирует график, который выглядит как ваше изображение. Стрелка идет к подграфу, именно то, что вы просили в свой вопрос.
вот два GraphvizFiddles, один исходного кода, генерирующего исходную ошибку и С ltail изменен на lhead, который соответствует вашей картинке.
(Я уверен, что потратил века на отладку той же проблемы в моих собственных графиках. Возможно, Graphviz может получить обновление, чтобы проверить, будет ли параметр ltail иметь смысл для головки стрелки и наоборот и выплюнуть более полезное сообщение об ошибке.)