Как создать ребро от узла до подграфа в Graphviz Dot?

Я хочу создать график, который выглядит так, я. е. где ребро выходит из узла Manufacturer of means of production в подграф с тем же именем.

Expected result

я написал для этого следующий код:

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:

ниже вы можете найти изображение ожидаемого результата-ребро, которое переходит от узла к подграфу (подграф, а не узел внутри подграфа). Этот край красный на изображении ниже.

Expected result

обновление 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="           "];

}

Second attempt

2 ответов


вам нужно изменить последнюю строку

mmp -> cluster1_1 [ltail=cluster1_mmp];

до

mmp -> cluster1_1 [lhead=cluster1 label="           "]

и затем график приходит, как ожидалось

Issue fixed

также, если вы хотите, чтобы край начинался вне коробки, вы бы сделали

mmp -> cluster1_1 [ltail=cluster0 lhead=cluster1 label="           "];

Box outside

редактировать

финальный код

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="           "]
}

скрипка ссылке для же

Fiddle


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 иметь смысл для головки стрелки и наоборот и выплюнуть более полезное сообщение об ошибке.)