2017-09-29 14 views
8

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

enter image description here enter image description here

मैं सबसे बाहरी नोड्स में से एक पर है, लेकिन किसी कारण नई लिंक प्रथम नोड के साथ संलग्न कर रहे थे (नीले एक) के लिए क्लिक किया। कुछ पता है कि ऐसा क्यों हो रहा है?

function draw_graph(graph) { 
    var color = d3.scaleOrdinal(d3.schemeCategory20); 

    var svg = d3.select("svg"), 
     width = +svg.attr("width"), 
     height = +svg.attr("height"), 
     node, 
     link; 

    svg.append('defs').append('marker') 
     .attrs({ 
      'id': 'arrowhead', 
      'viewBox': '-0 -5 10 10', 
      'refX': 13, 
      'refY': 0, 
      'orient': 'auto', 
      'markerWidth': 13, 
      'markerHeight': 13, 
      'xoverflow': 'visible' 
     }) 
     .append('svg:path') 
     .attr('d', 'M 0,-5 L 10 ,0 L 0,5') 
     .attr('fill', '#999') 
     .style('stroke', 'none'); 

    var simulation = d3.forceSimulation() 
     .force("link", d3.forceLink().id(function (d) { 
      return d.id; 
     }).distance(200).strength(1)) 
     .force("charge", d3.forceManyBody()) 
     .force("center", d3.forceCenter(width/2, height/2)); 

    update(graph.links, graph.nodes); 

    svg.selectAll('circle').on('dblclick', function() { 
     var pivot_id = ($(this).siblings('title').text()) 
     console.log('pivoting on', pivot_id) 
     pivot_search(pivot_id) 
    }); 


    function update(links, nodes) { 
     link = svg.selectAll(".link") 
      .data(links) 
      .enter() 
      .append("line") 
      .attr("class", "link") 
      .attr('marker-end', 'url(#arrowhead)') 


     edgepaths = svg.selectAll(".edgepath") 
      .data(links) 
      .enter() 
      .append('path') 
      .attrs({ 
       'class': 'edgepath', 
       'fill-opacity': 0, 
       'stroke-opacity': 0, 
       'id': function (d, i) { 
        return 'edgepath' + i 
       } 
      }) 
      .style("pointer-events", "none"); 

     edgelabels = svg.selectAll(".edgelabel") 
      .data(links) 
      .enter() 
      .append('text') 
      .style("pointer-events", "none") 
      .attrs({ 
       'class': 'edgelabel', 
       'id': function (d, i) { 
        return 'edgelabel' + i 
       }, 
       'font-size': 10, 
       'fill': '#aaa' 
      }); 

     node = svg.selectAll(".node") 
      .data(nodes) 
      .enter() 
      .append("g") 
      .attr("class", "node") 
      .call(d3.drag() 
       .on("start", dragstarted) 
       .on("drag", dragged) 
      ); 

     node.append("circle") 
      .attr("r", 5) 
      .attr("fill", function (d) { 
       return color(d.group); 
      }) 


     node.append("title") 
      .text(function (d) { 
       return d.id; 
      }); 

     node.append("text") 
      .attr("dy", -3) 
      .text(function (d) { 
       return d.label; 
      }); 


     simulation 
      .nodes(nodes) 
      .on("tick", ticked); 

     simulation.force("link") 
      .links(links); 

    } 

    function ticked() { 
     link 
      .attr("x1", function (d) { 
       return d.source.x; 
      }) 
      .attr("y1", function (d) { 
       return d.source.y; 
      }) 
      .attr("x2", function (d) { 
       return d.target.x; 
      }) 
      .attr("y2", function (d) { 
       return d.target.y; 
      }); 

     node 
      .attr("transform", function (d) { 
       return "translate(" + d.x + ", " + d.y + ")"; 
      }); 

     edgepaths.attr('d', function (d) { 
      return 'M ' + d.source.x + ' ' + d.source.y + ' L ' + d.target.x + ' ' + d.target.y; 
     }); 

     edgelabels.attr('transform', function (d) { 
      if (d.target.x < d.source.x) { 
       var bbox = this.getBBox(); 

       rx = bbox.x + bbox.width/2; 
       ry = bbox.y + bbox.height/2; 
       return 'rotate(180 ' + rx + ' ' + ry + ')'; 
      } 
      else { 
       return 'rotate(0)'; 
      } 
     }); 
    } 

    function dragstarted(d) { 
     if (!d3.event.active) simulation.alphaTarget(0.3).restart() 
     d.fx = d.x; 
     d.fy = d.y; 
    } 

    function dragged(d) { 
     d.fx = d3.event.x; 
     d.fy = d3.event.y; 
    } 


} 

function pivot_search(entity_id) { 
    var json = { 
     'nodes': [], 
     'links': [], 
    } 
    get_entities({'id': entity_id}) 
     .done(function (data) { 
      json.nodes.push({ 
       'label': data['results'][0]['label'], 
       'id': data['results'][0]['id'], 
       'group': data['results'][0]['entity_type'], 
      }) 
      get_entities({ 
       'related_entities': entity_id, 
       'related_entities__entity_instance__entity_type__strong_entity': true, 
       'page_size': 500 
      }) 
       .done(function (data) { 
        for (var i = 0; i < data['results'].length; i++) { 
         json.nodes.push({ 
          'label': data['results'][i]['label'], 
          'id': data['results'][i]['id'], 
          'group': data['results'][i]['entity_type'], 
         }) 
         json.links.push({ 
          'source': entity_id, 
          'target': data['results'][i]['id'], 

         }) 
        } 
        draw_graph(json) 
       }) 
     }) 
} 

संपादित करें: करने पर आगे की जांच जैसे कि यह नए डेटा से मौजूदा नोड लिंक की जगह और नए संभावित नकल नोड्स बनाने है लगता है।

link = svg.selectAll('.link') 
      .data(links, function (d) { 
       return d.id; 
      }) 
      .enter() 
      .append('line') 
      .attr('class', 'link') 
      .attr('marker-end', 'url(#arrowhead)') 


     edgepaths = svg.selectAll('.edgepath') 
      .data(links) 
      .enter() 
      .append('path') 
      .attrs({ 
       'class': 'edgepath', 
       'fill-opacity': 0, 
       'stroke-opacity': 0, 
       'id': function (d, i) { 
        return 'edgepath' + i 
       } 
      }) 
      .style('pointer-events', 'none'); 

     node = svg.selectAll('.node') 
      .data(nodes, function (d) { 
       return d.id; 
      }) 
      .enter() 
      .append('g') 
      .attr('class', 'node') 
      .call(d3.drag() 
       .on('start', dragstarted) 
       .on('drag', dragged) 
      ); 

मैं नोड दोहराव के साथ सौदा करने में मदद करने के लिए एक आईडी जोड़ा, लेकिन अब मैं इंडेक्स रूट विस्थापन के साथ एक समस्या है।

enter image description here enter image description here

+0

हाय- क्या आपने .डेटा में शामिल होने की कुंजी में गुजरने का प्रयास किया है? उदाहरण के लिए .डेटा (लिंक, फ़ंक्शन (डी) {वापसी d.id})। जब आप डेटा अपडेट करने के साथ स्थिरता चाहते हैं तो अक्सर इसकी आवश्यकता होती है। विवरण के लिए यहां देखें https://github.com/d3/d3-selection#selection_data –

+0

@tomShanley मैंने किया और इससे कुछ समस्याएं हल हुईं। लेकिन अभी भी लिंक के साथ अजीब समस्याओं में चल रहा है। –

उत्तर

1

ऐसा लगता है कि समस्या यह है कि आप कर रहे हैं तथ्य यह है कि अपने डेटा डी 3 के डेटा-में शामिल होने की कार्यक्षमता के भीतर डुप्लिकेट किया जा सकता है के कारण है। ऐसा लगता है कि इस मुद्दे को हल करने का सबसे अच्छा तरीका डी 3 से पहले आपके डेटा में प्रत्येक नोड के लिए "यूयूआईडी/GUID" बनाना है (उदाहरण के लिए here देखें)। एक बार ऐसा करने के बाद, आप डेटा को बाध्य कर सकते हैं और डेटा-जॉइन की कुंजी-निर्दिष्ट फ़ंक्शन का उपयोग कर सकते हैं (स्पष्टीकरण के लिए here देखें) D3 को आपके ऑब्जेक्ट के लिए बनाए गए UUID/GUID मानों का उपयोग करने के लिए स्थिरता की गारंटी के लिए बताएं। वहां से, आप माता-पिता के रिश्तों को आसान तरीके से संभालने में सक्षम होना चाहिए।

# संपादित करें 1

के बाद से है कि डुप्लिकेट मानों के लिए काम किया है, अगले समस्या यह है कि आप की संभावना हो रही है क्योंकि "स्रोत" वस्तु के संदर्भ में जिस तरह से है कि डी 3 उम्मीद करेंगे सेट नहीं है है। डी 3 में, लिंक की "स्रोत" संपत्ति वास्तविक स्रोत ऑब्जेक्ट का संदर्भ है, जहां आप केवल आईडी मान प्रदान कर रहे हैं (D3v4 दस्तावेज़ संदर्भ के लिए here देखें)। सरणी के भीतर वास्तविक स्रोत ऑब्जेक्ट का संदर्भ प्रदान करने का प्रयास करें और इसे ठीक करना चाहिए।

# संपादित 2

आप दृश्य में आने वाले नए डेटा संभाल रहे हैं कि में सही हैं, लेकिन मुझे नहीं लगता कि आप मौजूदा या पुराने (अर्थात, वह डेटा बिंदुओं कि नहीं कर रहे हैं संभाल रहे हैं लंबे प्रासंगिक और नोड्स/लिंक को हटाने की जरूरत है)। इस मामले में, माइक Bostock (D3.js लाइब्रेरी का मूल निर्माता) here से निम्नलिखित उदाहरण के साथ अपना कोड अपडेट करने का प्रयास करें और फिर पूरा होने के बाद रिपोर्ट करें। यह संभव है कि आप जो नए नोड्स देख रहे हैं वे केवल पुराने नोड्स हैं जिन्हें हटाया जाना चाहिए क्योंकि उनके पास अब उनके साथ बंधे बच्चे नहीं हैं, इसलिए डी 3 जे उन्हें वास्तव में "नए" या "मौजूदा" नोड्स के रूप में देखता है जो वास्तव में होने की आवश्यकता है हटा दिया।

+0

तो एक महत्वपूर्ण फ़ंक्शन जोड़ने से नोड्स के साथ डुप्लिकेशन समस्या हल हो गई, लेकिन सबकुछ अभी भी रूट से कनेक्ट हो रहा है। –

+0

संपादित टिप्पणी @ Stupid.Fat।बिल्ली – th3n3wguy

+0

ऐसा लगता है कि जिस तरह से मैं ग्राफ को अपडेट कर रहा हूं वह "सही" तरीका नहीं है, जिस तरह से मैं इसे नया डेटा जोड़ रहा हूं? (मूल रूप से svg लाएं और चीजों को इसमें वापस संलग्न करें) –

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