2011-11-13 8 views
20

यह संभव और व्यावहारिक मेथेमेटिका कुछ इस तरह (Graphviz द्वारा बनाई जा रही) आकर्षित करने के लिए के लिए हैगणित का उपयोग कर क्लासिक स्टेट आरेख कैसे आकर्षित करें?</p> <p><img src="https://i.stack.imgur.com/459Dr.png" alt="enter image description here"></p> <p>यह सबसे अच्छा है कि मैं प्राप्त कर सकते हैं (लेकिन आकार और शैली संतोषजनक नहीं हैं) है:

enter image description here

कोड:

GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D, 
    "went"}, {C -> C, "loop"}}, VertexLabeling -> True, 
DirectedEdges -> True] 
+0

वहाँ कोई कारण नहीं है आप ग्राफिक्स पुरातन उपयोग नहीं कर सकते कुछ इस तरह आकर्षित करने के लिए। क्या आप एक स्वचालित लेआउट समाधान का अनुरोध कर रहे हैं? –

+1

@ श्री विज़ार्ड हां, मैं जटिल राज्य आरेखों को चित्रित करने के लिए कुछ उच्च स्तरीय प्राइमेटिव ढूंढ रहा हूं। मुझे नहीं पता कि मैथमैटिका क्या प्रदान करता है या नहीं। मैंने प्रलेखन के माध्यम से खोज की और "ग्राफ़प्लॉट" फ़ंक्शन के विकल्पों की जांच की और उपरोक्त कोड के साथ समाप्त हो गया। – Ning

+0

आपने मेरा जवाब क्यों स्वीकार किया? यह आकार अभी भी गलत है। मैं इसकी सराहना करता हूं, लेकिन मुझे लगता है कि आपको बेहतर उत्तर की प्रतीक्षा करनी चाहिए। –

उत्तर

21

आप VertexRenderingFunction का उपयोग करके ऐसा कुछ कर सकते हैं।

GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D, "went"}, {C -> C, "loop"}}, 
DirectedEdges -> True, 
VertexRenderingFunction -> ({{White, Disk[#, 0.15]}, 
    AbsoluteThickness[2], Circle[#, 0.15], 
    If[MatchQ[#2, A | B], Circle[#, 0.12], {}], Text[#2, #]} &)] 

enter image description here


विधि फरवरी 2015

अपडेट किया गया सहभागी आरेखण उपकरण के साथ ग्राफ (डबल क्लिक करें) पुनर्व्यवस्थित करने के लिए एक के अंदर शीर्ष ग्राफिक्स रखना चाहिए क्षमता बनाए रखने के लिए GraphicsComplex, निर्देशांक के बजाय इंडेक्स के साथ। मेरा मानना ​​है कि कोई वृद्धिशील चर का उपयोग करके VertexRenderingFunction से ऐसा कर सकता है लेकिन पोस्ट-प्रोसेसिंग के साथ ऐसा करने के लिए संभवतः अधिक मजबूत लगता है। इस संस्करण 7 और के 10 में काम करता है मेथेमेटिका, शायद 8 और 9 के साथ-साथ:

GraphPlot[ 
    {{A -> C, "go"}, {C -> B, "gone"}, {C -> D, "went"}, {C -> C, "loop"}}, 
    DirectedEdges -> True 
] /. 
Tooltip[Point[n_Integer], label_] :> 
    {{White, Disk[n, 0.15]}, 
    Black, AbsoluteThickness[2], Circle[n, 0.15], 
    If[MatchQ[label, A | B], Circle[n, 0.12], {}], Text[label, n]} 

enter image description here

+0

क्या कोई "VertexLabelingFunction" है? – Ning

+0

@Ning मुझे मेरे उत्तर में एक त्रुटि थी; मेरा मतलब था 'VertexRenderingFunction'। मुझे विश्वास नहीं है कि वर्टेक्स ** लेबलिंग * फनसीन है। साथ ही, मैंने देखा कि सर्कल आकारों के संबंध में आपके मूल उदाहरण के सापेक्ष मेरे ग्राफिक्स में मुझे कोई दोष था। मैंने सही किया यह दूसरा संस्करण है जिसे मैंने अभी रखा है। –

5

इंटरैक्टिव प्लेसमेंट के लिए कोई जरूरत नहीं इच्छित स्थान पर अपने कोने प्राप्त करने के लिए के रूप में mr.Wizard पता चलता है his answer में। आपको लगता है कि के लिए VertexCoordinateRules उपयोग कर सकते हैं:

GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D, "went"}, {C -> C, "loop"}}, 
    DirectedEdges -> True, 
    VertexRenderingFunction -> 
      ({{White, Disk[#, 0.15]}, AbsoluteThickness[2], Circle[#, 0.15], 
      If[MatchQ[#2, A | B], Circle[#, 0.12], {}], Text[#2, #]} &), 
    VertexCoordinateRules -> 
      {A -> {0, 0}, C -> {0.75, 0},B -> {1.5, 0.25}, D -> {1.5, -0.25}} 
] 

enter image description here

+0

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

+0

@ श्री विज़ार्ड मुझे एक आसान तरीका नहीं दिख रहा है। –

संबंधित मुद्दे

 संबंधित मुद्दे