ग्राफविज़ - सबग्राफ कैसे कनेक्ट करें?


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
मुझे वही समस्या हो रही है, फिर भी उनके पास एक प्राकृतिक उदाहरण है जहां सबग्राफ नोड्स की तरह काम कर रहे हैं, graphviz.org/content/fdpclust
मुलुकरोनी

1
@nlucaroni मुझे आश्चर्य है कि अगर यह समस्या हल हो गई है। यह उदाहरण मुझे गलत ग्राफ देता है: किनारों को सबग्राफ के केंद्र कनेक्ट करते हैं। क्या आपको नहीं पता कि इसे उदाहरण में काम करने के लिए कैसे बनाया जाए?
k102

1
@ k102, मुझे पता है। उस पृष्ठ को फिर से देखें; यह कहता है कि आपको उपयोग करने की आवश्यकता है fdp। लिंक किए गए उदाहरण, और दोनों काम के ऊपर एक (उदाहरण में यहां अंतिम पंक्ति में सबग्राफ नाम का उपयोग करने की आवश्यकता है लेबल नहीं और रेखांकन के लिए लाइन की लंबाई शामिल करना अच्छा हो सकता है); यह थोड़ा तंग है)।
ल्युकेरोनी

1
@nlucaroni v2.28.0 का उपयोग fdpकरके और स्रोत से कॉपी / पेस्ट करना उदाहरण के लिए पंक्तियों को सबग्राफ के केंद्र से जोड़ता है, किनारों पर नहीं। यदि आप OmniGraffle में .dot खोलते हैं, तो वे ठीक से जुड़े हुए हैं, neatoऔर dotदोनों क्लस्टर के लिए शानदार नोड्स बनाते हैं।
फ्रॉग्ज

जवाबों:


190

डीओटी उपयोगकर्ता मैनुअल, गुच्छों के बीच किनारों के साथ एक ग्राफ का निम्नलिखित उदाहरण देता है:

महत्वपूर्ण: प्रारंभिक 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
धन्यवाद - यह काम करता है, लेकिन यह वास्तव में एक बदसूरत हैक की तरह लगता है। मैं उम्मीद कर रहा हूं कि मेरे पास ऐसा कोई परिदृश्य नहीं है जहां मेरे पास एक कंटेनर है जिसमें कोई नोड नहीं है।
विंस्टन स्मिथ

5
अगर किसी को इसमें दिलचस्पी है, तो इससे पोजिशनिंग की समस्या हो सकती है यदि आपने लिंक (किनारों) को लेबल किया है। जबकि सिर या किनारे की पूंछ एक क्लस्टर के नीचे छिपी हो सकती है, लेबल अभी भी मध्य बिंदु पर स्थित है, जिसका अर्थ है कि कुछ किनारे लेबल किनारे से ही स्थित होने के बजाय क्लस्टर पर तैरते दिखाई देते हैं।
विंस्टन स्मिथ

58
@WinstonSmith: पुराना प्रश्न है, लेकिन मुझे एक समान समस्या थी और इसे एक अदृश्य डमी नोड प्रति क्लस्टर के साथ हल किया गया था, जिसे क्लस्टर के खाली होने पर भी लिंक किया जा सकता है। DUMMY_0 [shape=point style=invis]
DevSolar

2
मैंने अपने अंतर-क्लस्टर किनारों को केवल तीर के शीर्षों तक ढहने के लिए पाया, जब समूहों का उपयोग किया जाता है जो केवल लंबवत रूप से जुड़े होते हैं। मैंने तय किया कि किनारों पर minlen = 1 के साथ । सी -> जी [लैलेट = क्लस्टर ०, लाइट = क्लस्टर १, मिनलेन = १];
फ़्रीनरड

3
यहाँ उदाहरण के साथ मैनुअल का लिंक दिया गया है: graphviz.org/Documentation/dotguide.pdf (पेज 30)।
किरिल ब्यूलगिन

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=trueमें graphघोषणा महत्वपूर्ण है। यह उत्पादन का उत्पादन करता है:

जुड़े समूहों के साथ ग्राफ

ध्यान दें कि मैंने किनारों को क्लस्टर के भीतर संदर्भ नोड्स में बदल दिया है, प्रत्येक किनारे पर पट्टिका और लेश विशेषताओं को जोड़ा है, क्लस्टर नाम निर्दिष्ट किया है, और ग्राफ-स्तरीय विशेषता 'कंपाउंड = सच' को जोड़ा है।

इस चिंता के बारे में कि कोई इसके अंदर कोई नोड्स के साथ क्लस्टर कनेक्ट करना चाहता है, मेरा समाधान हमेशा हर क्लस्टर में एक नोड जोड़ने के लिए किया गया है , शैली = सादा के साथ प्रदान की गई है। क्लस्टर को लेबल करने के लिए इस नोड का उपयोग करें (क्लस्टर के अंतर्निहित "लेबल" विशेषता के बजाय, जिसे खाली स्ट्रिंग (पायथन में label='""') पर सेट किया जाना चाहिए । इसका मतलब है कि मैं अब किनारों को जोड़ने वाला नहीं हूं जो सीधे क्लस्टर जोड़ता है, लेकिन मेरी विशेष स्थिति में काम करता है।


24
नोट: 'ग्राफ [फॉण्टाइज़ = 10 फॉन्टनेम = "वर्डाना" कम्पाउंड = सच];' आवश्यक है - यदि आप याद करते हैं कि लिलेट / लैह को जोड़ने से काम नहीं होता है।
एस। डेनियल

1
@JonathanHartley, आपके पिछले पैराग्राफ के अनुसार, क्या नोड के बीच में कोई रास्ता है जो क्लस्टर के बीच में है?
पचेरियर

क्लस्टर का नाम भी बड़े अक्षर से शुरू नहीं होना चाहिए
JCLL

7
@ s। डैनियल यह सिर्फ यौगिक है = सत्य; जो आवश्यक है
डॉ। मैक्स वोल्केल

"आइटम 1" -> "आइटम 3" लिंक करते समय रीसेट हेड और लैल्ट के बजाय, मैं क्लस्टर_0 और क्लस्टर 1 को अर्थपूर्ण कोड से कैसे लिंक करूं? मैं मीम, cluster_0 -> cluster_1आप उत्पादन के रूप में मौजूद हैं। क्योंकि क्लस्टर_1 में कई अन्य मदों में कई आइटम हो सकते हैं (कई से कई या एक से कई)। सिर्फ दो को जोड़ना अच्छा होगा।
मिथिला

11

सुनिश्चित करें कि आप fdpफ़ाइल के लिए लेआउट का उपयोग कर रहे हैं । मुझे नहीं लगता कि neatoक्लस्टर का समर्थन करता है।


2
मैंने भी अनुभवात्मक रूप से पाया है कि neatoइंजन क्लस्टर का समर्थन नहीं करता है .. मुझे यकीन नहीं है कि यह बग है या नहीं ..
रॉस रोजर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.