GraphViz-하위 그래프를 연결하는 방법?


166

DOT언어 GraphViz로 종속성 다이어그램을 나타내려고합니다. 컨테이너 내에 노드를 가질 수 있어야하고 노드 및 / 또는 컨테이너를 다른 노드 및 / 또는 컨테이너에 종속시킬 수 있어야합니다.

subgraph컨테이너를 나타내는 데 사용 하고 있습니다. 노드 연결은 정상적으로 작동하지만 하위 그래프를 연결하는 방법을 알 수 없습니다.

아래의 프로그램을 감안할 때, 나는 연결할 수 있어야 cluster_1하고 cluster_2화살표가,하지만 난 해봤 아무것도 대신 클러스터를 연결하는 새로운 노드를 생성합니다 :

digraph G {

    graph [fontsize=10 fontname="Verdana"];
    node [shape=record fontsize=10 fontname="Verdana"];

    subgraph cluster_0 {
        node [style=filled];
        "Item 1" "Item 2";
        label = "Container A";
        color=blue;
    }

    subgraph cluster_1 {
        node [style=filled];
        "Item 3" "Item 4";
        label = "Container B";
        color=blue;
    }

    subgraph cluster_2 {
        node [style=filled];
        "Item 5" "Item 6";
        label = "Container C";
        color=blue;
    }

    // Renders fine
    "Item 1" -> "Item 2";
    "Item 2" -> "Item 3";

    // Both of these create new nodes
    cluster_1 -> cluster_2;
    "Container A" -> "Container C";
}

여기에 이미지 설명을 입력하십시오


2
나는 같은 문제를 겪고 있지만 하위 그래프가 node, graphviz.org/content/fdpclust 처럼 작동하는 자연스러운 예를 가지고 있습니다 .
nlucaroni

1
@nlucaroni이 문제가 해결되는지 궁금합니다. 이 예는 나에게 잘못된 그래프를 제공합니다 : 가장자리는 하위 그래프의 중심을 연결합니다. 예제와 같이 작동하게 만드는 방법을 모르십니까?
k102

1
@ k102, 알고 있습니다. 해당 페이지를 다시 확인하십시오. 그것은 당신이 사용해야한다고 말합니다 fdp. 연결된 예제와 위의 두 예제가 모두 작동합니다 (여기 예제의 마지막 줄은 레이블이 아닌 하위 그래프 이름을 사용해야하며 그래프의 줄 길이를 포함하는 것이 좋을 수 있습니다). 그것은 약간 빡빡합니다).
nlucaroni

1
@nlucaroni v2.28.0을 사용 fdp하고 예제에서 소스를 복사 / 붙여 넣기하면 선이 가장자리가 아닌 하위 그래프의 중앙에 연결됩니다. OmniGraffle에서 .dot를 열면 제대로 연결되어 neato있고 dot둘 다 클러스터에 불필요한 노드를 만듭니다.
Phrogz

답변:


190

DOT 사용자 매뉴얼은 클러스터 사이에 모서리가있는 클러스터가있는 다음 그래프 예를 제공합니다.

중요 : 초기 compound=true진술이 필요합니다.

digraph G {
  compound=true;
  subgraph cluster0 {
    a -> b;
    a -> c;
    b -> d;
    c -> d;
  }
  subgraph cluster1 {
    e -> g;
    e -> f;
  }
  b -> f [lhead=cluster1];
  d -> e;
  c -> g [ltail=cluster0,lhead=cluster1];
  c -> e [ltail=cluster0];
  d -> h;
}

...와 노드와 클러스터 사이의 가장자리 :

여기에 이미지 설명을 입력하십시오


14
고마워-그것은 작동하지만 실제로 추한 해킹처럼 느껴집니다. 난 희망 나는 어떤 노드가있는 용기가 어디 시나리오가 없습니다.
Winston Smith

5
관심있는 사람이있는 경우 링크 (가장자리) 레이블이 있으면 위치 문제가 발생할 수 있습니다. 머리 또는 가장자리의 꼬리가 클러스터 아래에 숨겨져있을 수 있지만 레이블은 여전히 ​​중간 점에 배치됩니다. 즉, 일부 가장자리 레이블은 가장자리 자체가 아니라 클러스터 위에 떠있는 것처럼 보입니다.
Winston Smith

58
@ WinstonSmith : 오래된 질문이지만 비슷한 문제가 있었고 클러스터 당 보이지 않는 더미 노드로 해결했습니다. 클러스터가 비어 있으면 링크 할 수 있습니다. DUMMY_0 [shape=point style=invis]
DevSolar

2
세로로만 연결된 클러스터를 사용할 때 클러스터 간 가장자리가 화살촉으로 축소되는 것을 발견했습니다. 가장자리에 minlen = 1로 고정했습니다 . c-> g [ltail = cluster0, lhead = cluster1, minlen = 1];
Freenerd

3
다음은 예제와 함께 설명서에 대한 링크입니다. graphviz.org/Documentation/dotguide.pdf (페이지 30).
Kirill Bulygin

90

쉽게 참조 할 수 있도록 HighPerformanceMark의 답변에 설명 된 솔루션은 원래 질문에 직접 적용되며 다음과 같습니다.

digraph G {

    graph [fontsize=10 fontname="Verdana" compound=true];
    node [shape=record fontsize=10 fontname="Verdana"];

    subgraph cluster_0 {
        node [style=filled];
        "Item 1" "Item 2";
        label = "Container A";
        color=blue;
    }

    subgraph cluster_1 {
        node [style=filled];
        "Item 3" "Item 4";
        label = "Container B";
        color=blue;
    }

    subgraph cluster_2 {
        node [style=filled];
        "Item 5" "Item 6";
        label = "Container C";
        color=blue;
    }

    // Edges between nodes render fine
    "Item 1" -> "Item 2";
    "Item 2" -> "Item 3";

    // Edges that directly connect one cluster to another
    "Item 1" -> "Item 3" [ltail=cluster_0 lhead=cluster_1];
    "Item 1" -> "Item 5" [ltail=cluster_0 lhead=cluster_2];
}

compound=truegraph선언은 매우 중요합니다. 출력이 생성됩니다.

연결된 클러스터가있는 그래프

클러스터 내에서 노드를 참조하도록 에지를 변경하고 각 에지에 ltail 및 lhead 속성을 추가하고 클러스터 이름을 지정하고 그래프 수준 속성 'compound = true'를 추가했습니다.

노드가없는 클러스터를 연결하려는 걱정에 대해 내 솔루션은 항상 style = plaintext로 렌더링 된 모든 클러스터에 노드를 추가하는 것이 었습니다 . 이 노드를 사용하여 빈 문자열 (Python에서는 label='""') 로 설정해야하는 클러스터의 내장 "label"속성 대신 클러스터에 레이블을 지정합니다 . 이는 더 이상 클러스터를 직접 연결하는 모서리를 추가하지 않지만 내 특정 상황에서 작동합니다.


24
참고 : 'graph [fontsize = 10 fontname = "Verdana"compound = true];' ltail / lhead와의 연결이 작동하지 않는 경우 필수입니다.
s.Daniel

1
@JonathanHartley, 마지막 단락에 따라 클러스터 중간에 해당 노드를 중앙에 배치 할 수있는 방법이 있습니까?
Pacerier

또한 클러스터의 이름은 대문자로 시작해서는 안됩니다
JCLL

7
@ s.Daniel 그것은 단지 복합 = 사실입니다; 이는 필요
박사 최대 Völkel을

"Item 1"-> "Item 3"링크시 lhead 및 ltail을 재설정하는 대신 cluster_0과 cluster_1을 의미있는 코드로 어떻게 연결합니까? 나는 cluster_0 -> cluster_1당신이 출력으로 선물을합니다. cluster_0에 많은 항목이있을 수 있기 때문에 cluster_1의 다른 많은 항목에 연결됩니다 (다 대다 또는 일대 다). 두 개만 연결하는 것이 좋습니다.
Mithril

11

fdp파일 레이아웃을 사용하고 있는지 확인하십시오 . neato클러스터를 지원 하지 않는다고 생각 합니다.


2
나도 neato엔진이 클러스터를 지원하지 않는다는 것을 경험적으로 발견했다 . 이것이 버그인지 아닌지는 모르겠다.
Ross Rogers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.