2011-01-12 19 views
28

खुले स्रोत जावा ग्राफ़ ड्राइंग फ्रेमवर्क का उपयोग निम्नलिखित आवश्यकताओं के साथ नेटवर्क आरेख के लिए उपयोग करने के लिए करता है? ग्राफ में 1000 से कम नोड्स होंगे।नेटवर्क टोपोलॉजी ड्राइंग के लिए ओपन सोर्स जावा ग्राफ ड्राइंग फ्रेमवर्क (जंगल और प्रीफ्यूज) की तुलना

1) समानांतर किनारों
2) का निर्देशन किया और एक भी ग्राफ
3) के भीतर अनिर्दिष्ट किनारों छवियों
4) नोड्स के साथ उपयोगकर्ता बातचीत का प्रतिनिधित्व करती नोड हैं और किनारों
5) गतिशील रूप से जोड़ने/नोड्स और किनारों को हटाने
6) नोड्स और किनारों पर एकाधिक लेबलिंग, लेबलिंग के विभिन्न स्तर उपयोगकर्ताओं द्वारा बंद/चालू किया जा सकता है। (परतों में ड्राइंग और एक परत पर बंद करना)
7) स्टार, अंगूठी, जाल टोपोलॉजीज प्रदर्शित करने के लिए विभिन्न लेआउट एल्गोरिदम

मैंने जंगल और प्रीफ्यूज का मूल्यांकन किया। यह मेरी आवश्यकताओं में से प्रत्येक के लिए मिला है।

1) प्रीफ्यूज समानांतर किनारों को प्रदर्शित नहीं कर सकता है जबकि जंगल इसका समर्थन करता है। समांतर किनारों को प्रदर्शित करने के लिए कोड को छेड़छाड़ की जा सकती है? चूंकि इसमें बुनियादी डेटा स्तर परिवर्तन शामिल हैं, मेरा मानना ​​है कि यह अधिक कठिन होगा कि सामान्य अनुकूलित प्रतिपादन में परिवर्तन होता है।

2) मुझे दोनों प्रीफ्यूज और जंगल में संयुक्त ग्राफ (निर्देशित और अप्रत्यक्ष किनारों दोनों) का कोई संदर्भ नहीं मिला। क्या कोई अन्यथा जानता है?

3) यह दोनों Prefuse और जंग

4 के साथ आसान लगता है) एक बार फिर दोनों Prefuse और जंग उपयोगकर्ता बातचीत के लिए सहायता प्रदान करता है।

5) दोनों prefuse और जंगल इसका समर्थन करता है। ग्राफ़ को फिर से भरते समय प्रत्येक ढांचा कैसे करता है? मैंने एक और पोस्ट में देखा कि प्रीफ्यूज़ गतिशील अपडेट के लिए अच्छा प्रदर्शन नहीं करता है (Prefuse Toolkit: dynamically adding nodes and edges)

6) यह ग्राफ को संशोधित करने और इसे फिर से निकालने के लिए नीचे आता है। तो सवाल 5)

7) दोनों जंगल और प्रीफ्यूज़ में एकाधिक लेआउट एल्गोरिदम हैं। लेकिन जब मैंने जंगल और प्रीफ्यूज दोनों में FruchtermanReingoldLayout का उपयोग करके उसी डेटासेट को प्रदर्शित करने का प्रयास किया तो मुझे अलग-अलग डिस्प्ले मिलते हैं। कोई विचार क्यों? किसी भी तरह प्रीफ्यूज़ में लेआउट एल्गोरिदम जंगल की तुलना में बेहतर लेआउट प्रदर्शित करने लगते हैं (प्रतिपादन भी बेहतर है) मुझे लगता है कि प्रीफ्यूज में अधिकांश लेआउट एल्गोरिदम जंगल कार्यान्वयन पर आधारित हैं। प्रीफ्यूज लेआउट जैसे फोर्सडायरेक्टलायआउट/फ्रूचरमैनिंगिंगल्डलायआउट और सर्किलआउट सीधे स्टार, सर्कल, जाल टोपोलॉजीज पर नक्शा लगाते हैं।

इन आवश्यकताओं के बाहर, prefuse अभिव्यक्तियों और क्वेरी भाषा के लिए अच्छा समर्थन है लेकिन ऐसा लगता है कि यह सक्रिय रूप से जंगल के विपरीत विकसित नहीं है। किसके पास बेहतर दृश्यता है? कोई भी सुझाव जिस पर कोई उपयुक्त होगा और कमियों को कैसे दूर किया जाए?

कोई अन्य ढांचा जो मैं उपयोग कर सकता हूं?

+7

+1: यहाँ (दोनों का निर्देशन किया और अनिर्दिष्ट किनारों) 2 के लिए समाधान, Prefuse के लिए करने के लिए अपने कार्यान्वयन है । मुझे यह तथ्य पसंद है कि आपने दो संभावित संभावनाओं का मूल्यांकन करने और अपने निष्कर्ष प्रस्तुत किए हैं। आपके प्रश्न से परे दूसरों के लिए यहां बहुत मूल्य है। यह एक नए उपयोगकर्ता के लिए सबसे अच्छा "पहला सवाल" हो सकता है जिसे मैंने यहां दो वर्षों में देखा है। अगर मैं कर सकता तो मैं इसे और अधिक दे दूंगा। – duffymo

उत्तर

3

कुछ साल पहले (2007?) मैं कॉल डेटा रिकॉर्ड को देखने के लिए प्रीफ्यूज का उपयोग करता हूं। मैंने prefuse, जंग, jgraph और कुछ अन्य माना जाता है और prefuse चुना। सबसे पहले मेरे सिर को prefuse के चारों ओर लपेटना थोड़ा मुश्किल है, लेकिन एक बार जब मैं इससे परिचित हो गया तो यह वास्तव में आसान (विस्तार करने के लिए) और उपयोग करने में मजेदार है। मुझे लगता है कि जंगल के लिए भी यही कहा जा सकता है लेकिन मैंने कभी कोशिश नहीं की।

1) प्रीफ्यूज़ में समानांतर किनारों को चित्रित करने के लिए अपना स्वयं का कस्टम रेंडरर जोड़ना बहुत आसान है - आप डिफ़ॉल्ट एज रेंडरर को उपclass कर सकते हैं और रेंडर() विधि को ओवरराइड कर सकते हैं। आवश्यक "मूल डेटा स्तर परिवर्तन" नहीं है। यदि आप इसे एमवीसी सामान के रूप में सोचना चाहते हैं तो यह सब कुछ दृश्य भाग में है।

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

3) यह सुपर आसान

4) डिट्टो

5) पिछले Prefuse रिलीज "Prefuse बीटा रिलीज 2007/10/21" है। मैंने इससे पहले एक का उपयोग किया था, जिसमें नोड्स को गतिशील रूप से जोड़ते या हटाते समय संभावित दौड़ की स्थिति होती है - मुझे लगता है कि इसमें कुछ सिंक्रनाइज़ किए गए कीवर्ड गायब थे। मैंने हल किया कि नोड्स को जोड़ने या हटाने के दौरान सभी एनीमेशन और क्रियाओं (रंग, आकार, लेआउट) को रोकने के लिए सुनिश्चित करना - अपने ल्यूसीन इंडेक्स को भी अपडेट करना न भूलें (यदि आप इसके अंतर्निर्मित ल्यूसीन सर्च इंजन का उपयोग करते हैं)। नवीनतम व्यक्ति को इस दौड़ के मुद्दे को हल करना है, लेकिन मुझे इसे आजमाने का मौका कभी नहीं मिला।

6) चूंकि आपने "एकाधिक लेबलिंग" का उल्लेख किया है, मुझे लगता है कि यह "ग्राफ को संशोधित करने और इसे फिर से निकालने" का मामला नहीं है - यह केवल आपके लेबल/किनारे प्रस्तुतकर्ताओं को केवल प्रासंगिक लेबल खींचने के लिए अनुकूलित करने की बात है, इसलिए यह नहीं है वास्तव में एक बड़ा मुद्दा है। इसके अलावा मुझे नहीं लगता कि यह 5 से संबंधित है।

7) मुझे आश्चर्य नहीं है कि फ्रूचरमैनिंगिंगल्डआउट के प्रीफ्यूज और जंगल का प्रतिपादन अलग-अलग हैं - ऐसे कुछ कारक हैं जो उनमें से एक को शुरुआती नोड को प्रभावित कर सकते हैं जहां प्रत्येक कार्यान्वयन गणना शुरू करता है इसलिए मैं ज्यादा चिंता नहीं करता इस मुद्दे के बारे में। प्रीफ्यूज में विभिन्न बिल्टिन ग्राफ़ लेआउट एल्गोरिदम को आज़माकर बहुत आसान है ताकि आप आगे बढ़ सकें और जांच सकें कि आप कौन सा सबसे करीब है। स्टार लेआउट के लिए RadialLayout और BalloonTreeLayout देखें। ForceDirectedLayout को नोड्स के प्लेसमेंट के लिए "स्थिर" होने के लिए कुछ पुनरावृत्तियों की आवश्यकता है। ध्यान दें कि इन पुनरावृत्तियों को दिखाने के लिए आवश्यक नहीं है ताकि आप इसे पृष्ठभूमि में चला सकें और अंतिम परिणाम प्रस्तुत कर सकें।

मैंने जंगल का उपयोग नहीं किया है, इसलिए मैं इस पर अधिक टिप्पणी नहीं कर सकता।

प्रीफ्यूज के साथ अपने अनुभव के आधार पर मैं अत्यधिक अच्छी तरह से (आईएमएचओ) विचार-विमर्श डिजाइन और घटकों के बीच सांस लेने के कारण इसकी अत्यधिक अनुशंसा करता हूं। जेफरी हीर (प्रीफ्यूज लेखक) ने वास्तव में वहां एक अच्छी नौकरी की।

चीजें अगर आप Prefuse का उपयोग (इन दोनों के "गले-अंगूठे" है कि मैं ताजा जब Prefuse के साथ काम करने को याद कर रहे हैं) के लिए बाहर देखने के लिए:

1) वहाँ एक बग जहां जब ज़ूम आउट करके, नोड लेबल है उचित रूप से ज़ूम आउट नहीं किया गया है कि यह नोड के बाध्यकारी बॉक्स को बहता है जो नोड चलने पर फ़ॉन्ट ड्राइंग कलाकृतियों को छोड़ देगा क्योंकि रेंडरर केवल नोड के बाउंडिंग बॉक्स में सामान को साफ़ और साफ़ करता है। आईआईआरसी यह एडब्ल्यूटी फ़ॉन्ट मेट्रिक में एक बग के कारण होता है। वर्कअराउंड लेबल और नोड बाउंडिंग बॉक्स के बीच पर्याप्त मार्जिन छोड़ना है।

2) अंतर्निर्मित लेआउट को विस्तारित करते समय, आपको एक या दो "स्कोपिंग समस्या" का सामना करना पड़ सकता है, जहां सुपरक्लास का सदस्य जिसे आप एक्सेस करना चाहते हैं उसे संरक्षित करने के बजाय निजी विशेषता दी जाती है या तो पुस्तकालय को स्वयं संशोधित करना है या विरासत के बिना एक नई कक्षा बनाना है (जो थोड़ा दर्दनाक हो सकता है!)। मुझे लगता है कि आप कुछ अन्य जावा पुस्तकालयों के लिए भी ऐसा कह सकते हैं। हर किसी के पास हिंडसाइट नंबर का लाभ नहीं है? :)

चूंकि आपने एक महीने पहले (मुझे यह लिखने के समय) इस सवाल से पूछा था कि मैं जानना चाहता हूं कि आपका निर्णय क्या था और यदि आप कार्यान्वयन के साथ आगे बढ़े तो यह आपके लिए कैसे निकला।

2

मुझे पता है कि आपने निर्दिष्ट जंगल और प्रीफ्यूज निर्दिष्ट किया है ... मुझे टॉमसायर और वाईफाइल दोनों के साथ अच्छा अनुभव रहा है। आपके द्वारा प्रस्तावित आवश्यकताओं की सूची इन दोनों के लिए बहुत ही बुनियादी है - और वे बहुत अधिक समर्थन करते हैं।

रण।

0

मैं JGraph का मूल्यांकन करने का सुझाव दूंगा।

5

मैं जंगल के निर्माता और रखरखाव में से एक हूं, इसलिए नीचे दिए गए प्रतिक्रियाओं के लिए ध्यान रखें।

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

यहां जंगल के लिए उन प्रश्नों के उत्तर दिए गए हैं। उनमें से कई ((1), (2), (4) PluggableRendererDemo में प्रदर्शन कर रहे हैं:

  1. समर्थित (आप सही डाटा मॉडल की आवश्यकता होगी, सभी प्रदर्शन कारणों से समानांतर किनारों का समर्थन नहीं)
  2. समर्थित (फिर से, आप सही डाटा मॉडल की जरूरत है)
  3. समर्थित (ImageShaperDemo देखें)
  4. समर्थित (सबसे क़ौम)
  5. समर्थित (GraphEditorDemo देखें)
  6. सीधे समर्थित नहीं है, हालांकि आप Certa कर सकते हैं लेबल को गतिशील रूप से बदलें और जटिल लेबल प्रस्तुत करने के लिए HTML का उपयोग करें।
  7. जंगल के लेआउट एल्गोरिदम सामान्य नेटवर्क के लिए अधिक हैं (पेड़ों के लिए कुछ अपवादों के साथ)। आप निश्चित रूप से अपना खुद का लेआउट एल्गोरिदम बना सकते हैं, और कई ने ऐसा किया है।

उम्मीद है कि इससे मदद मिलती है।

0

मुझे @ holygeek का जवाब पसंद है। इस के लिए

public class MyRenderFactory implements RendererFactory 
{ 
    private NodeRenderer nodeRenderer = new NodeRenderer(); 
    private EdgeRenderer defaultEdgeRenderer = new EdgeRenderer(); 
    private EdgeRenderer undirectedEdgeRenderer = new EdgeRenderer(EdgeRenderer.EdgeType.LINE, EdgeRenderer.EdgeArrowType.NONE); 

    public static String directedness = "myEdgeDirectedness"; 

    public enum EdgeDirected 
    { 
     directed, undirected; 

     public static EdgeDirected fromIsDirected(boolean isDirected) 
     { 
      if (isDirected) 
      { 
       return directed; 
      } 
      return undirected; 
     } 
    } 

    @Override 
    public Renderer getRenderer(VisualItem<?> visualItem) 
    { 
     if (visualItem instanceof EdgeItem) 
     { 
      if (visualItem.get(directedness).equals(PrefuseGraphConverter.EdgeDirected.undirected)) 
      { 
       return undirectedEdgeRenderer; 
      } 
      return defaultEdgeRenderer; 
     } 
     return nodeRenderer; 
    } 
} 

... कहीं और है, जहां ग्राफ बनाई गई है ...

MyRenderFactory.EdgeDirected directedness = 
     MyRenderFactory.EdgeDirected.fromIsDirected(myEdge.isDirected()); 
prefuseEdge.set(MyRenderFactory.directedness, directedness); 
संबंधित मुद्दे