Pergunta

Na linguagem DOT para GraphViz, eu estou tentando representar um diagrama de dependência. Eu preciso ser capaz de ter os nós dentro de um recipiente e para ser capaz de fazer nós e / ou recipientes dependentes em outros nós e / ou recipientes.

Eu estou usando subgraph para representar meus recipientes. Nó de ligação funciona muito bem, mas eu não consigo descobrir como conectar subgraphs.

Dado o programa abaixo, eu preciso ser capaz de cluster_1 conexão e cluster_2 com uma seta, mas qualquer coisa que eu tentei cria novos nós em vez de conectar os clusters:

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";
}

enter descrição da imagem aqui

Foi útil?

Solução

O manual do utilizador DOT dá o seguinte exemplo de um gráfico com os conjuntos com arestas entre os agrupamentos

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;
}

e arestas entre nós e clusters.

enter descrição da imagem aqui

Outras dicas

Para facilitar a referência a solução descrita na resposta de HighPerformanceMark, aplicado diretamente à pergunta original, esta aparência:

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];
}

O compound=true na declaração graph é vital. Isso produz uma saída:

do gráfico com aglomerados ligados entre si

Nota que mudou as bordas para nós de referência dentro do agrupamento, adicionou-se o ltail e atributos lhead para cada borda, especificando o nome do cluster, e adicionou-se o atributo de nível gráfico 'composto = verdadeiro'.

No que diz respeito a preocupação de que um pode querer ligar um cluster com nenhum nó dentro dela, a minha solução tem sido a de sempre adicionar um nó a cada cluster, processado com style = texto simples. Utilize este nó para rotular o cluster (em vez do cluster está Isso significa que eu não sou mais built-in atributo "rótulo", que deve ser definido para a cadeia vazia (em Python, label='""'). Adicionando bordas que os aglomerados se conectar diretamente, mas ele funciona na minha situação particular.

Certifique-se que você está usando o layout fdp para o arquivo. Eu não acho que os clusters suporta neato.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top