2013-09-04 10 views
6

तो, मैं बल निर्देशित ग्राफ के साथ खेल रहा हूं, और मैंने इसे बनाया है। मेरे नोड पर टेक्स्ट टेक्स्ट से दूसरे टेक्स्ट पर माउस पर बदल जाता है।डी 3 फोर्स लेआउट नोड लेबल्स में लाइन ब्रेक डालने

मेरे कोड इस तरह दिखता है:

स्क्रिप्ट:

var data = {"nodes":[ 
         {"name":"YHO", "full_name":"Yahoo", "type":1, "slug": "www.yahoo.com", "entity":"company", "img_hrefD":"", "img_hrefL":""}, 
         {"name":"GGL", "full_name":"Google", "type":2, "slug": "www.google.com", "entity":"company", "img_hrefD":"", "img_hrefL":""}, 
         {"name":"BNG", "full_name":"Bing", "type":2, "slug": "www.bing.com", "entity":"company", "img_hrefD":"", "img_hrefL":""}, 
         {"name":"YDX", "full_name":"Yandex", "type":2, "slug": "www.yandex.com", "entity":"company", "img_hrefD":"", "img_hrefL":""}, 

         {"name":"Desc1", "type":4, "slug": "", "entity":"description"}, 
         {"name":"Desc2", "type":4, "slug": "", "entity":"description"}, 
         {"name":"Desc4", "type":4, "slug": "", "entity":"description"}, 

         {"name":"CEO", "prefix":"Mr.", "fst_name":"Jim", "snd_name":"Bean", "type":3, "slug": "", "entity":"employee"}, 
         {"name":"ATT", "prefix":"Ms.", "fst_name":"Jenna", "snd_name":"Jameson", "type":3, "slug": "", "entity":"employee"}, 
         {"name":"CTO", "prefix":"Mr.", "fst_name":"Lucky", "snd_name":"Luke", "type":3, "slug": "", "entity":"employee"}, 
         {"name":"CDO", "prefix":"Ms.", "fst_name":"Pamela", "snd_name":"Anderson", "type":3, "slug": "", "entity":"employee"}, 
         {"name":"CEO", "prefix":"Mr.", "fst_name":"Nacho", "snd_name":"Vidal", "type":3, "slug": "", "entity":"employee"}, 
        ], 
      "links":[ 
         {"source":0,"target":4,"value":1,"distance":5}, 
         {"source":0,"target":5,"value":1,"distance":5}, 
         {"source":0,"target":6,"value":1,"distance":5}, 

         {"source":1,"target":4,"value":1,"distance":5}, 
         {"source":2,"target":5,"value":1,"distance":5}, 
         {"source":3,"target":6,"value":1,"distance":5}, 

         {"source":7,"target":3,"value":10,"distance":6}, 
         {"source":8,"target":3,"value":10,"distance":6}, 
         {"source":9,"target":1,"value":10,"distance":6}, 
         {"source":10,"target":1,"value":10,"distance":6}, 
         {"source":11,"target":2,"value":10,"distance":6}, 
         ] 
       }  



    var w = 560, 
     h = 500, 
     radius = d3.scale.log().domain([0, 312000]).range(["10", "50"]); 

    var vis = d3.select("body").append("svg:svg") 
     .attr("width", w) 
     .attr("height", h); 

     //vis.append("defs").append("marker") 
     //.attr("id", "arrowhead") 
     //.attr("refX", 22 + 3) /*must be smarter way to calculate shift*/ 
     //.attr("refY", 2) 
     //.attr("markerWidth", 6) 
     //.attr("markerHeight", 4) 
     //.attr("orient", "auto") 
     //.append("path") 
      //.attr("d", "M 0,0 V 4 L6,2 Z"); //this is actual shape for arrowhead 

    //d3.json(data, function(json) { 
     var force = self.force = d3.layout.force() 
      .nodes(data.nodes) 
      .links(data.links) 
      .linkDistance(function(d) { return (d.distance*10); }) 
      //.friction(0.5) 
      .charge(-250) 
      .size([w, h]) 
      .start(); 



     var link = vis.selectAll("line.link") 
      .data(data.links) 
      .enter().append("svg:line") 
      .attr("class", function (d) { return "link" + d.value +""; }) 
      .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; }) 
      .attr("marker-end", function(d) { 
               if (d.value == 1) {return "url(#arrowhead)"} 
               else { return " " } 
              ;}); 


     function openLink() { 
      return function(d) { 
       var url = ""; 
       if(d.slug != "") { 
        url = d.slug 
       } //else if(d.type == 2) { 
        //url = "clients/" + d.slug 
       //} else if(d.type == 3) { 
        //url = "agencies/" + d.slug 
       //} 
       window.open("//"+url) 
      } 
     } 




     var node = vis.selectAll("g.node") 
      .data(data.nodes) 
      .enter().append("svg:g") 
      .attr("class", "node") 
      .call(force.drag); 


     node.append("circle") 
      .attr("class", function(d){ return "node type"+d.type}) 
      .attr("r",function(d){if(d.entity == "description"){ return 6 } else { return 18 }}) 
      //.on("mouseover", expandNode); 
      //.style("fill", function(d) { return fill(d.type); }) 



     node.append("svg:image") 
      .attr("class", function(d){ return "circle img_"+d.name }) 
      .attr("xlink:href", function(d){ return d.img_hrefD}) 
      .attr("x", "-36px") 
      .attr("y", "-36px") 
      .attr("width", "70px") 
      .attr("height", "70px") 
      .on("click", openLink()) 
      .on("mouseover", function (d) { if(d.entity == "company") 
               { 
        d3.select(this).attr("width", "90px") 
            .attr("x", "-46px") 
            .attr("y", "-36.5px") 
            .attr("xlink:href", function(d){ return d.img_hrefL});       
               } 
       }) 
      .on("mouseout", function (d) { if(d.entity == "company") 
              { 
        d3.select(this).attr("width", "70px") 
            .attr("x", "-36px") 
            .attr("y", "-36px") 
            .attr("xlink:href", function(d){ return d.img_hrefD}); 
              } 
       });  


     node.append("svg:text") 
      .attr("class", function(d){ return "nodetext title_"+d.name }) 
      .attr("dx", 0) 
      .attr("dy", ".35em") 
      .style("font-size","10px") 
      .attr("text-anchor", "middle") 
      .style("fill", "white") 
      .text(function(d) { if (d.entity != "description"){return d.name} }); 


     node.on("mouseover", function (d) { 
      if (d.entity == "company"){ 
       d3.select(this).select('text') 
        .transition() 
        .duration(300) 
        .text(function(d){ 
          return d.full_name; 
         }) 
        .style("font-size","15px") 

      } 
      else if(d.entity == "employee"){ 
       d3.select(this).select('text') 
        .transition() 
        .duration(300) 
        .text(function(d){return d.prefix + ' ' + d.fst_name + ' ' + d.snd_name}) 
        .style("font-size","8px") 

      } 
      else { 
       d3.select(this).select('text') 
        .transition() 
        .duration(300) 
        .style("font-size","15px") 
      } 

      if (d.entity == "company") { 
       d3.select(this).select('image') 
        .attr("width", "90px") 
        .attr("x", "-46px") 
        .attr("y", "-36.5px") 
        .attr("xlink:href", function (d) { 
         return d.img_hrefL 
         });    
      } 

      if (d.entity == "company") { 

       d3.select(this).select('circle') 
           .transition() 
           .duration(300) 
           .attr("r",28) 

      } 
      else if (d.entity == "employee"){ 
       d3.select(this).select('circle') 
           .transition() 
           .duration(300) 
           .attr("r",32) 
      } 
     }) 


     node.on("mouseout", function (d) { 
      if (d.entity == "company") { 
       d3.select(this).select('text') 
        .transition() 
        .duration(300) 
        .text(function(d){return d.name;}) 
        .style("font-size","10px") 
       } 
      else if(d.entity == "employee"){ 
       d3.select(this).select('text') 
        .transition() 
        .duration(300) 
        .text(function(d){return d.name;}) 
        .style("font-size","10px") 

      } 
      else { 
       d3.select(this).select('text') 
        .transition() 
        .duration(300) 
        .style("font-size","10px") 
      } 


      if (d.entity == "company") { 
       d3.select(this).select('image') 
        .attr("width", "70px") 
        .attr("x", "-36px") 
        .attr("y", "-36px") 
        .attr("xlink:href", function (d) { 
        return d.img_hrefD 
       }); 
      } 

      if (d.entity == "company" || d.entity == "employee") { 

       d3.select(this).select('circle') 
           .transition() 
           .duration(300) 
           .attr("r",18) 
      } 

     }); 

     force.on("tick", function() { 
      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 + ")"; }); 
     }); 
    //}); 

तुम मेरे jsfiddle में काम उदाहरण देख सकते हैं: http://jsfiddle.net/dzorz/6pHkn/

कोड का हिस्सा है जो मुझे परेशान है कि माउसओवर है:

else if(d.entity == "employee"){ 

    d3.select(this).select('text') 
       .transition() 
     .duration(300) 
     .text(function(d){return d.prefix + ' ' + d.fst_name + ' ' + d.snd_name}) 
     .style("font-size","8px") 

} 

मैंके बीच एक लाइन ब्रेक जोड़ना चाहता हूंऔर d.snd_name और मैं '\n' और '<\br>' साथ की कोशिश की और यह नहीं कर रहा था कि मैं क्या प्राप्त करना चाहता था ...

कौन सा d3 में जिस तरह से पाठ पर लाइन ब्रेक जोड़ने के लिए है?

आप उपरोक्त अपने सभी जुड़े हुए jsfiddle संपादित कर सकते हैं ...

कोई भी सुझाव का स्वागत है

+0

[यह प्रश्न] (http://stackoverflow.com/questions/13049050/can-you-insert-a-line-break-in-text-when-using-d3-js) मदद कर सकता है। –

+0

मैंने इस विधि का उपयोग करने का प्रयास किया है, लेकिन मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए, मुझे .html पर त्रुटि मिल रही है, इसलिए मुझे लगा कि कोई मुझे एक रास्ता दिखा सकता है – dzordz

+0

उत्तर में एक वास्तविक उदाहरण है इस सवाल के लिए] (http://stackoverflow.com/questions/11007640/fit-text-into-svg-element-using-d3-js)। –

उत्तर

5

यहाँ है, क्योंकि किसी कारण यह अभ्यस्त इस बल सामान के साथ काम के लिए एसवीजी अंदर HTML का उपयोग कर के बिना जवाब।

else if(d.entity == "employee"){ 
       var asdf = d3.select(this); 
       asdf.select('text').remove(); 

       asdf.append("text") 
          .text(function(d){return d.prefix + ' ' + d.fst_name }) 
          .attr("class","nodetext") 
          .attr("dx", 0) 
          .attr("dy", ".35em") 
          .style("font-size","5px") 
          .attr("text-anchor", "middle") 
          .style("fill", "white") 
          .transition() 
          .duration(300) 
          .style("font-size","12px"); 

       asdf.append("text").text(function(d){return d.snd_name }) 
          .attr("class","nodetext") 
          .attr("transform","translate(0, 12)") 
          .attr("dx", 0) 
          .attr("dy", ".35em") 
          .style("font-size","5px") 
          .attr("text-anchor", "middle") 
          .style("fill", "white") 
          .transition() 
          .duration(300) 
          .style("font-size","12px");           
      } 

Jsfiddle उदाहरण: http://jsfiddle.net/cuckovic/FWKt5/

+1

अपने उत्तर आदमी से प्यार है! :) – dzordz

+0

धन्यवाद, मुझे खुशी है कि मेरे जवाब ने किसी की मदद की। – cuckovic

3

ऊपर जवाब, बस किस्म की खातिर सुंदर है, लेकिन, यहां भी सिर्फ एक पाठ रैप समारोह लिखा कि स्वचालित रूप से आप के लिए यह करना होगा है। मूल प्रतिनिधित्व विशेष रूप से चार्ट पर लेबल के लिए होता है, लेकिन आप शायद जो भी चाहते हैं उसे करने के लिए इसे कुशल बना सकते हैं। http://bl.ocks.org/mbostock/7555321

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