Domanda

Nel linguaggio DOT per GraphViz, sto cercando di rappresentare un diagramma di dipendenza. Ho bisogno di essere in grado di avere nodi all'interno di un contenitore e di essere in grado di fare nodi e / o contenitori dipendente da altri nodi e / o contenitori.

sto usando subgraph per rappresentare i miei contenitori. Nodo di collegamento funziona bene, ma non riesco a capire come collegare sottografi.

Dato il seguente programma, ho bisogno di essere in grado di connettersi cluster_1 e cluster_2 con una freccia, ma tutto quello che ho provato crea nuovi nodi invece di collegare i cluster:

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

entrare descrizione dell'immagine qui

È stato utile?

Soluzione

L'manuale DOT fornisce il seguente esempio di un grafico con i cluster con bordi tra cluster

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

ed i bordi tra i nodi e cluster.

entrare descrizione dell'immagine qui

Altri suggerimenti

Per facilità di riferimento la soluzione di cui la risposta di HighPerformanceMark, applicato direttamente alla domanda iniziale, si presenta in questo modo:

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

Il compound=true nella dichiarazione graph è di vitale importanza. Che produce output:

grafico con cluster collegati

Si noti che ho cambiato i bordi per fare riferimento nodi all'interno del cluster, aggiunto il ltail e lhead attribuisce a ciascun bordo, specificando il nome del cluster e aggiunto l'attributo a livello grafico 'composto = true'.

Per quanto riguarda la preoccupazione che si potrebbe desiderare di collegare un cluster con alcun nodo al suo interno, la mia soluzione è stata quella di sempre aggiungere un nodo a ogni cluster, reso con style = testo in chiaro. Utilizzare questo nodo per etichettare cluster (invece del cluster built-in "etichetta" attributo, che deve essere impostato alla stringa vuota (in Python, label='""'). Questo significa che non sono più aggiungendo bordi che si collegano direttamente cluster, ma funziona nella mia situazione particolare.

Assicurarsi che si sta utilizzando il layout fdp per il file. Non credo neato supporta cluster.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top