2011-10-15 16 views
18

मैं अपने ग्राफ करना चाहते हैं अंदर बाएं-दाएं इस तरह दिखता है:ऊपर से नीचे subgraphs, subgraphs

लेकिन मैं केवल इस प्राप्त कर सकते हैं:

समस्या यह है कि rankdirdoes not worksubgraph में। तो, इसे अनुकरण कैसे करें?

कोड:

digraph G { 
    node [shape = circle] 
    0 [style = invis] 

    0 -> "0A" 

    subgraph clusterA { 
     label=A 
     "0A" 
     "1A" 
     "2A" -> "0A" [label=•] 
    } 

    subgraph clusterB { 
     label=B 
     "0B" 
     "1B" 
     "2B" -> "0B" [label=•] 
    } 

     subgraph clusterC { 
     label=C 
     "0C" 
     "1C" 
     "2C" -> "0C" [label=•] 
    } 

    subgraph clusterD { 
     label=D 
     "0D" 
     "1D" 
     "2D" -> "0D" [label=•] 
    } 

    subgraph clusterE { 
     label=E 
     "0E" 
     "1E" 
     "2E" -> "0E" [label=•] 
    } 

    subgraph clusterF { 
     label=F 
      {node [shape = doublecircle] "0F" "1F"} 
     "2F" -> "0F" [label=•] 
    } 

    "0A" -> "1B" [label=a] 
    "1A" -> "2B" [label=a] 
    "0B" -> "1C" [label=b] 
    "1B" -> "2C" [label=b] 
    "0C" -> "1D" [label=c] 
    "1C" -> "2D" [label=c] 
    "0D" -> "1E" [label=d] 
    "1D" -> "2E" [label=d] 
    "0E" -> "1F" [label=e] 
    "1E" -> "2F" [label=e] 
} 

उत्तर

31

Reproducing विशेष ग्राफ लेआउट आमतौर पर के साथ प्राप्त किया जा सकता है:

  • अदृश्य नोड्स और किनारों
  • रैंक की कमी

यहाँ कैसे मैं अपने ग्राफ reproduced है - या कम से कम एक हिस्सा इसका:

digraph g { 
    rankdir="LR"; 
    node[shape = circle, fontsize=14]; 
    fontsize=18; 
    labeljust="l"; 

    edge[style=invis, fontsize=12]; 

    { rank=same; 
     0 [style = invis]; 
     01 [style = invis]; 
     02 [style=invis]; 
     0 -> 01 -> 02; 
    } 

    subgraph clusterA { 
     "0A" -> "1A" -> "2A"; 
     "2A" -> "0A" [label=".", constraint=false, style=solid]; 
     label="A"; 
    } 

    subgraph clusterB { 
     "0B" -> "1B" -> "2B"; 
     "2B" -> "0B" [label=".", constraint=false, style=solid]; 
     label="B"; 
    } 

    subgraph clusterC { 
     "0C" -> "1C" -> "2C"; 
     "2C" -> "0C" [label=".", constraint=false, style=solid]; 
     label="C"; 
    } 

    0 -> "0A"[style=solid]; 
    01 -> "0B"[style=invis]; 
    02 -> "0C"[style=invis]; 

    // edges between clusters 
    edge[constraint=false, style=solid]; 
    "0A" -> "1B" [label=a] 
    "1A" -> "2B" [label=a] 
    "0B" -> "1C" [label=b] 
    "1B" -> "2C" [label=b] 
} 

यह समाधान बहुत सहज नहीं है। अंक की एक जोड़ी इस लक्ष्य को हासिल करने के लिए:

  • मैं rankdir="LR" जो TB से अच्छे किनारों में हुई चुना है, हालांकि यह वास्तव में
  • अदृश्य नोड्स ग्राफ की दिशा के साथ अनुरूप नहीं है और किनारों के लिए उपयोग कर रहे हैं क्लस्टर को संरेखित करने के लिए शीर्ष रैंक नोड्स (0, 01, 02)।
  • (अदृश्य) शीर्ष नोड्स को एक ही रैंक पर मजबूर किया जाता है और अदृश्य किनारों से जुड़ा होता है - इससे यह सुनिश्चित होगा कि प्रत्येक नोड से जुड़े क्लस्टर सही क्रम में दिखाई देते हैं।

परिणाम है:

graphviz output

+0

@ जेसन-s इनाम के लिए धन्यवाद! काफी जवाबहीन, इस उत्तर को सबमिट करने के कई सालों बाद! – marapet

1

का उपयोग बाधा = false जिस तरह से आप चाहते हैं http://www.graphviz.org/doc/info/attrs.html#d:constraint

subgraph clusterB { 
    label=B 
    "0B" 
    "1B" 
    "2B" -> "0B" [constraint=false label=•] 
} 

बाहर बारी करने के उसके बाद आप अपने subgraphs कि मिल जाएगा अपने subgraphs में नोड्स मिलना चाहिए जिस तरह से आप चाहते हैं एक दूसरे के साथ लाइन मत करो। ऐसा कुछ ऐसा हल कर सकता है।

"0A" -> "0B" -> "0C" -> "0D" -> "0E" [weight=999 style=invis]; 
संबंधित मुद्दे