अपने मैक पर ग्राफविज़ पदानुक्रम को इंडेंटेड आउटलाइन की तरह पढ़ने योग्य बनाने के लिए, प्रत्येक नोड को एक पंक्ति और एक इंडेंटेशन निर्देशांक दें, फिर neato -n2 से रेंडर करें। यह पैरेंट-चाइल्ड एज को संरक्षित रखते हुए आपको पढ़ने के क्रम को नियंत्रित करने देता है।

यह वॉकथ्रू छह-नोड उदाहरण बनाता है और PDF निर्यात करता है। लक्ष्य विशिष्ट है: प्रति पंक्ति एक नोड, वंशज तुरंत अपने पैरेंट के नीचे, और समान गहराई वाले नोड्स के लिए समान इंडेंटेशन। ग्राफविज़ अपने -n कमांड-लाइन विकल्प के माध्यम से फिक्स्ड-पोजिशन रेंडरिंग का दस्तावेजीकरण करता है।

सामान्य ग्राफविज़ ट्री आउटलाइन की तरह क्यों नहीं दिखता?

एक पदानुक्रम संबंधों का वर्णन करता है; एक इंडेंटेड आउटलाइन एक पढ़ने का क्रम भी निर्दिष्ट करता है। इस उदाहरण में, रूट में दो शाखाएं हैं, और पहली शाखा के वंशज दूसरी शाखा से पहले आने चाहिए। वांछित क्रम है:

Node R
    Node A
        Node C
        Node D
    Node B
        Node E

ग्राफ के संबंध हैं: रूट से A, रूट से B, A से C, A से D, और B से E। D से B का कोई संबंध नहीं है केवल इसलिए कि B अगली पंक्ति पर आता है। DOT -> ऑपरेटर के साथ डायरेक्टेड एज व्यक्त करता है; नोड घोषणाएं और उनके प्रेजेंटेशन एट्रिब्यूट भाषा के अलग-अलग भाग हैं। आधिकारिक DOT भाषा संदर्भ देखें।

ग्राफविज़ का dot इंजन पदानुक्रमित या लेयर्ड ड्रॉइंग उत्पन्न करता है। यह एज को एक सामान्य दिशा में लक्षित करता है जबकि क्रॉसिंग और एज लंबाई को कम करने का प्रयास करता है। वह उद्देश्य एक ब्रांचिंग डायग्राम के अनुकूल है, लेकिन यह ऊपर दिखाए गए एक-पंक्ति-प्रति-नोड आउटलाइन को परिभाषित नहीं करता। dot लेआउट दस्तावेज़ीकरण देखें।

कई परिचित एट्रिब्यूट केवल समस्या का एक हिस्सा संबोधित करते हैं:

सेटिंग दस्तावेज़ीकृत उद्देश्य जो अनसुलझा रह जाता है
rankdir=LR लेआउट दिशा को बाएं से दाएं बदलता है ऊर्ध्वाधर आउटलाइन क्रम निर्दिष्ट नहीं करता
rank=same एक सबग्राफ के नोड्स को समान रैंक पर रखता है प्रत्येक नोड को अपनी आउटलाइन पंक्ति असाइन नहीं करता
ordering=out आउटगोइंग एज को इनपुट क्रम में बाएं से दाएं दिखने के लिए बाध्य करता है गहराई-आधारित इंडेंटेशन और पंक्ति निर्देशांक परिभाषित नहीं करता

ये सीमाएं rankdir, rank, और ordering के आधिकारिक संदर्भों का पालन करती हैं। इस लेख में सटीक पंक्ति व्यवस्था के लिए, उन एट्रिब्यूट को संयोजित करने की तुलना में स्पष्ट निर्देशांक अधिक प्रत्यक्ष निर्माण प्रदान करते हैं।

मैक पर ग्राफविज़ कैसे तैयार करें?

Terminal खोलें। यदि आप पहले से Homebrew का उपयोग करते हैं, तो निम्न कमांड से ग्राफविज़ इंस्टॉल करें। आधिकारिक ग्राफविज़ डाउनलोड पृष्ठ इस मैक इंस्टॉलेशन विधि को सूचीबद्ध करता है:

brew install graphviz

यदि आप इसके बजाय MacPorts का उपयोग करते हैं, तो वही डाउनलोड पृष्ठ sudo port install graphviz सूचीबद्ध करता है। जो पैकेज मैनेजर आप पहले से उपयोग करते हैं उसे चुनें। यदि कोई भी इंस्टॉल नहीं है, तो उस पृष्ठ से प्रासंगिक इंस्टॉलेशन लिंक का पालन करने के बाद इस वॉकथ्रू पर लौटें।

जांचें कि रेंडरर उपलब्ध है:

neato -V

-V विकल्प ग्राफविज़ संस्करण जानकारी प्रिंट करता है। कंप्यूटरों में परिणामों की तुलना करते समय रिपोर्ट किए गए संस्करण को रखें; आपको इस लेख में प्रिंट किए गए किसी विशेष संस्करण संख्या की आवश्यकता नहीं है। ग्राफविज़ इस विकल्प का दस्तावेजीकरण अपने कमांड लाइन संदर्भ में करता है।

इंडेंटेड पदानुक्रम कैसे बनाएं?

निम्न पूर्ण शेल ब्लॉक एक नया वर्किंग फोल्डर बनाता है और वहां DOT फाइल लिखता है। इसे Terminal में चलाएं; समाप्त होने पर फोल्डर पथ प्रिंट होगा। कोटेड हेरेडॉक डिलीमीटर DOT टेक्स्ट को लिखे गए रूप में संरक्षित करता है।

outline_dir=$(mktemp -d "$HOME/graphviz-outline.XXXXXX")
if [ -n "$outline_dir" ] && cd "$outline_dir"; then
  cat > hierarchy.dot <<'DOT'
digraph Hierarchy {
  graph [splines=ortho, bgcolor=white];
  node [
    shape=box,
    width=1.2,
    height=0.35,
    fixedsize=true,
    fontname="Courier",
    fontsize=12
  ];

  r [label="Node R", pos="100,300"];
  a [label="Node A", pos="136,252"];
  c [label="Node C", pos="172,204"];
  d [label="Node D", pos="172,156"];
  b [label="Node B", pos="136,108"];
  e [label="Node E", pos="172,60"];

  r -> a;
  r -> b;
  a -> c;
  a -> d;
  b -> e;
}
DOT
  pwd
fi

नोड स्थिति आउटलाइन को एनकोड करती है। प्रत्येक क्रमिक पंक्ति 48 पॉइंट नीचे जाती है, और प्रत्येक अतिरिक्त गहराई 36 पॉइंट दाएं जाती है। वे संख्याएं स्पेसिंग के उदाहरणात्मक विकल्प हैं, ग्राफविज़ डिफ़ॉल्ट नहीं। pos दस्तावेज़ीकरण निर्दिष्ट करता है कि नोड स्थिति नोड केंद्रों को संदर्भित करती है और neato -n के साथ उपयोग किए जाने पर स्थितियों को पॉइंट के रूप में व्याख्या करता है।

नोड गहराई पंक्ति, शून्य से शुरू केंद्र स्थिति
Node R 0 0 100,300
Node A 1 1 136,252
Node C 2 2 172,204
Node D 2 3 172,156
Node B 1 4 136,108
Node E 2 5 172,60

इस निर्माण के लिए, निर्देशांक नियम x = 100 + 36 × depth और y = 300 − 48 × row हैं। Node D से Node B पर वापसी पर ध्यान दें: पंक्ति आगे बढ़ती है, लेकिन गहराई घट जाती है। वह एकल संक्रमण है जो ड्रॉइंग को चेन के बजाय आउटलाइन के रूप में पढ़ने योग्य बनाता है।

सभी बॉक्स के समान आयाम हैं, इसलिए समान केंद्र निर्देशांक उनके बाएं किनारों को भी संरेखित करते हैं। समान-लंबाई के सिंथेटिक लेबल टेक्स्ट प्लेसमेंट की तुलना को आसान बनाते हैं। fixedsize=true के साथ, ग्राफविज़ निर्दिष्ट नोड आयामों का उपयोग करता है बजाय बॉक्स को उनकी सामग्री में फिट करने के लिए बड़ा करने के; ओवरसाइज़्ड लेबल चेतावनी उत्पन्न करते हैं। fixedsize संदर्भ देखें।

परिणाम कैसे रेंडर और निरीक्षण करें?

उसी Terminal सत्र और वर्किंग फोल्डर में, चलाएं:

neato -n2 -Tpdf hierarchy.dot -o hierarchy.pdf

यहां, -n2 ओवरलैप समायोजन के बिना आपूर्ति की गई नोड व्यवस्था को रखता है और उन एज के लिए रूट की गणना करता है जिनके पास अपनी स्थिति नहीं है। इसलिए इस वर्कफ़्लो के लिए हर नोड को pos मान चाहिए। -Tpdf और -o विकल्प PDF आउटपुट और उसके गंतव्य का चयन करते हैं। ये व्यवहार कमांड लाइन संदर्भ में दस्तावेजीकृत हैं।

Finder में वर्किंग फोल्डर खोलें और hierarchy.pdf खोलें। PDF आउटपुट के लिए ग्राफविज़ बिल्ड की आवश्यकता होती है जिसमें कायरो रेंडरर शामिल हो, जैसा कि ग्राफविज़ के PDF आउटपुट पृष्ठ पर निर्दिष्ट है। उदाहरण को दस्तावेज़ीकरण के विरुद्ध जांचा गया है, लेकिन इसे यहां रेंडर-टेस्ट नहीं किया गया है क्योंकि शोध वातावरण में ग्राफविज़ अनुपलब्ध था।

तीन चीजों का अलग-अलग निरीक्षण करें:

  1. नीचे पढ़ें: R, A, C, D, B, E को क्रमिक पंक्तियों पर कब्जा करना चाहिए।
  2. इंडेंटेशन की तुलना करें: A और B संरेखित होने चाहिए; C, D, और E एक कदम और दाएं संरेखित होने चाहिए।
  3. संबंधों का पता लगाएं: R, A और B से जुड़ता है; A, C और D से जुड़ता है; B, E से जुड़ता है।

पहले दो जांच निर्देशांक निर्माण का आकलन करते हैं। तीसरी वास्तविक ग्राफ की जांच करती है। उन जांचों को अलग रखने से एक डायग्राम को पकड़ने में मदद मिलती है जो व्यवस्थित दिखता है लेकिन इसमें गलत पैरेंट-चाइल्ड एज होता है।

क्या कनेक्टर बिल्कुल फाइल ब्राउज़र के ट्री की तरह दिखेंगे?

नोड पंक्तियां और इंडेंटेशन स्पष्ट रूप से निर्दिष्ट हैं; कनेक्टर पथ अभी भी गणना किए जाते हैं। उदाहरण splines=ortho का अनुरोध करता है, जो एक्सिस-संरेखित खंडों के माध्यम से एज को रूट करता है। ग्राफविज़ का दस्तावेज़ीकरण यह भी बताता है कि यह रूटिंग पोर्ट को हैंडल नहीं करती, इसलिए कंपास पोर्ट जोड़ना एक विशेष एल्बो पैटर्न को बाध्य करने का एक दस्तावेजीकृत तरीका नहीं है। splines संदर्भ देखें।

नतीजतन, यह निर्माण स्वचालित रूप से रूटेड राइट-एंगल कनेक्टर के साथ एक इंडेंटेड पदानुक्रम प्रदान करता है। यह एक साझा ऊर्ध्वाधर रेल को सटीक रूप से रखे गए ब्रांच जंक्शन के साथ निर्धारित नहीं करता। यदि वह कनेक्टर ज्यामिति आवश्यक है, तो इसके लिए स्पष्ट रूप से निर्दिष्ट एज पथ के साथ एक अतिरिक्त निर्माण की आवश्यकता होती है; splines=ortho अकेले उस आवश्यकता को व्यक्त नहीं करता।

दृश्य कनेक्टर के बिना एक साफ आउटलाइन के लिए, ग्राफ सेटिंग को splines=none में बदलें और फिर से रेंडर करें। DOT फाइल में अभी भी उसके पैरेंट-चाइल्ड एज हैं, जबकि रेंडरर उनके स्ट्रोक को छोड़ देता है। यह उसी splines संदर्भ में एक दस्तावेजीकृत रेंडरिंग विकल्प है।

उदाहरण को उसके अर्थ को बदले बिना कैसे अनुकूलित करें?

इच्छित पढ़ने के क्रम को एज सूची से स्वतंत्र रूप से लिखकर शुरू करें। पहले एक पैरेंट पर जाएं, फिर उसका पहला बच्चा और उस बच्चे के वंशज, अगले बच्चे पर जाने से पहले। उस क्रम में प्रत्येक नोड को एक पंक्ति असाइन करें। फिर गहराई से इंडेंटेशन असाइन करें।

उदाहरण के लिए, Node D के बाद Node A के नीचे एक और बच्चा जोड़ने के लिए, इसे Node B से पहले पढ़ने के क्रम में डालें। इसे गहराई दो दें, बाद की पंक्तियों को नीचे ले जाएं, और A से नए नोड तक एक एज जोड़ें। मौजूदा पैरेंट संबंध केवल इसलिए नहीं बदलते क्योंकि उनकी पंक्ति संख्या बदलती है।

संपादित संस्करण गलत दिखने पर निम्न निदान क्रम का उपयोग करें:

  • ड्रॉइंग एक अलग व्यवस्था में फैल जाती है: पुष्टि करें कि कमांड अभी भी neato -n2 का उपयोग करती है। उदाहरण सामान्य स्वचालित लेआउट के बजाय आपूर्ति की गई स्थितियों पर निर्भर करता है।
  • रेंडरिंग लापता स्थिति की रिपोर्ट करता है: हर नोड ID की जांच करें, जिसमें केवल एज स्टेटमेंट में उल्लिखित ID शामिल हैं। इस वर्कफ़्लो के लिए प्रत्येक को एक स्थित घोषणा की आवश्यकता है।
  • एक लेबल अपने बॉक्स से आगे निकल जाता है: सामान्य बॉक्स आयाम बढ़ाएं या लेबल छोटा करें। फिक्स्ड-साइज़ बॉक्स स्वचालित रूप से विस्तार नहीं करते।
  • बॉक्स बड़ा करने के बाद पंक्तियां ओवरलैप होती हैं: पंक्ति अंतराल बढ़ाएं। चुना गया रेंडरिंग मोड ओवरलैप को ठीक करने के बजाय स्थितियों को संरक्षित करता है।
  • एक शाखा गलत नोड से जुड़ती है: एज स्टेटमेंट को सही करें। एक बॉक्स को हिलाने से गलत संबंध ठीक नहीं हो सकता।

लापता-स्थिति और ओवरलैप शर्तें ग्राफविज़ के दस्तावेजीकृत -n2 व्यवहार का पालन करती हैं; लेबल शर्त इसके fixedsize व्यवहार का पालन करती है। स्पेसिंग बढ़ाना इस मैन्युअल रूप से स्थित उदाहरण के लिए संबंधित डिज़ाइन समायोजन है।

पदानुक्रम की एज सूची को संबंधों के स्रोत के रूप में और निर्देशांक तालिका को प्रेजेंटेशन के स्रोत के रूप में रखें। एक छोटे मैक डेस्कटॉप डायग्राम के लिए, वह पृथक्करण परिणाम को बनाए रखने के लिए सीधा बनाता है: जब पदानुक्रम बदलता है तो एज बदलें, जब पढ़ने का क्रम बदलता है तो पंक्तियां बदलें, और जब लेबल को अधिक जगह चाहिए तो स्पेसिंग बदलें।

स्रोत