215 votes

GraphViz - comment connecter sous-graphes ?

Dans l' DOT langue GraphViz, je suis en train d'essayer de représenter un diagramme de dépendance. J'ai besoin d'être en mesure d'avoir des nœuds à l'intérieur d'un conteneur et d'être en mesure de faire des nœuds et/ou les conteneurs dépend des autres nœuds et/ou les conteneurs.

Je suis à l'aide d' subgraph pour représenter mon conteneurs. Nœud reliant fonctionne très bien, mais je ne peux pas savoir comment connecter les sousgraphes.

Étant donné le programme ci-dessous, j'ai besoin d'être en mesure de se connecter cluster_1 et cluster_2 avec une flèche, mais rien de ce que j'ai essayé de crée de nouveaux nœuds au lieu de relier les pôles d'activités:

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 image description here

252voto

High Performance Mark Points 49691

Le manuel d’utilisation DOT donne l’exemple suivant d’un graphe avec les clusters avec des bords entre clusters

et les bords entre les nœuds et les grappes.

enter image description here

103voto

Jonathan Hartley Points 3763

Pour plus de facilité, la solution décrite dans HighPerformanceMark réponse, appliqué directement à la question initiale, ressemble à ceci:

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

et produit en sortie:

graph with connected clusters

Note que j'ai changé les bords de référence des noeuds dans le cluster, a ajouté le ltail et lhead attributs de chaque bord, en spécifiant le nom du cluster, et a ajouté le graphique au niveau de l'attribut 'composé=true'.

Quant à l'inquiétude qu'on peut avoir envie de se connecter à un cluster avec pas de noeuds à l'intérieur, ma solution a été de toujours ajouter un nœud à chaque cluster, rendus avec style=texte en clair. Ce nœud à l'étiquette du cluster (au lieu de le cluster intégré "étiquette" attribut, qui devrait être fixé à une chaîne vide (en Python, label='""'). Cela signifie que je ne suis plus l'ajout d'arêtes qui relient les clusters directement, mais il fonctionne dans mon cas en particulier.

15voto

mihajlv Points 935

Assurez-vous que vous utilisez mise en page pour le fichier. Je ne pense pas que prend en charge les clusters.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X