2016-03-06 108 views
0

當前繪圖具有在d3中製作的圓形圖,並且想要爲每個圓弧添加一組多邊形線,每個圓弧將以特定角度從每個圓弧中擠出,具體取決於圓弧的位置所在。使用條件語句在d3.js中繪製多段線

<!doctype HTML> 
<html> 
    <head> 
     <title>Page Title</title> 
     <meta charset="UTF-8"> 

     <script type="text/javascript" src="js/d3.min.js"></script> 
     <link rel="stylesheet" type="text/css" href="css/style.css"> 

    </head> 
    <body> 

     <script type="text/javascript"> 

//========================================================================================================================================= 
// initializing variables 


      var data = []; // empty array to hold the objects imported from the JSON file 
      var oRadius = 300; //var holding value for the outer radius of the arc 
      var iRadius = 80; //var holding the value for the inner radius of the arc 
      var cRadius = 3; //var holding the value for the corner radius of the arc 
      var colors = d3.scale.category20b();//built in D3 function to color pieces of data 
      var width = 1400; //setting the width of the svg 
      var height = 1000; //setting the height of the svg 
      var dRadius = 5; //setting the radius for the dots 
      var sColor = "white"; // color for the stroke of the arcs 
      var dStrokeColor = "#666"; 
      var dFillColor = "#ccc" 


      var lineMaker = d3.svg.line().x(function(d) { return d.x; }).y(function(d) { return d.y; }).interpolate("linear"); 

      var myArcMaker= d3.svg.arc().outerRadius(oRadius).innerRadius(iRadius).cornerRadius(cRadius); //var that creates the arc 

      var bigArcMaker= d3.svg.arc().outerRadius(400).innerRadius(oRadius).cornerRadius(cRadius); 

      var mySvg = d3.select('body') 
          .append('svg') 
          .attr('width', width) 
          .attr("height", height) //selecting the body and appending an, then svg setting the height and width properties for the svg 
          .append("g") 
          .attr("transform", "translate(" + width/2 + "," + height/2 + ")")// centers the pie chart in the center of the svg 


          mySvg.append("g") 
          .attr("class", "slices"); 
          mySvg.append("g") 
          .attr("class", "dots"); 
          mySvg.append("g") 
          .attr("class", "lines"); 
          mySvg.append("g") 
          .attr("class", "polyLines"); 



      var myPie = d3.layout.pie() 
         .sort(null) 
         .startAngle(2*(Math.PI)) 
         .endAngle(((Math.PI))/360) 
         .padAngle(-1.5*(2*(Math.PI))/360).value(function(d){return d.value}); //setting the values for that start angle, end angle and pad angle for the arcs and takes in the the values from the objects in the data array 

//====================================================================================================================================================== 


       d3.json("data.json", function (json) // importing the json file 
       { 

        data = json; // setting the empty data array equal to the values of the objects in the json file 
        visual(); // this function holds all the d3 code to create the arc 

       }) 



//====================================================================================================================================================== 

      function visual() // this function prevents the code that creates the arc from running before the objects from the json file are added into the empty data array 
      { 

       // console.log(data); // checking to see if the objects are loaded into the data ray using the console in chrome 








       var slice = mySvg.select(".slices") 
        .selectAll("path.slice") 
        .data(myPie(data)) // 
        .enter() 
        .append("path") 
        .attr("class", "slice") 
        .attr("d", function(d) { 
        return myArcMaker(d) 
        }) 
        .attr("fill", function(d, i) { 
        return colors(i); 
        }) //using the d3 color brewer to color each arc 
        .attr("stroke", "white") //giving each arc a stroke of white 

       var dots = mySvg.select("g.dots") 
        .selectAll("cirlces") 
        .data(myPie(data)) 
        .enter() 
        .append("circle") 
        .attr("class", "g.dots") 
        .attr("transform", function(d) 
        { 
        return "translate(" + myArcMaker.centroid(d) + ")"; 
        }) 
        .attr("r", dRadius) 
        .attr("fill", dFillColor) 
        .attr("stroke", sColor) 
//     
       var lines = mySvg.select(".lines") 
        .selectAll("path.lines") 
        .data(myPie(data)) // 
        .enter() 
        .append("path") 
        .attr("class", "lines") 
        .attr("d", function(d) { 
        return bigArcMaker(d) 
        }).attr("fill", "none") 
        .attr("stroke", "white") 


       var outerDots = mySvg.select("g.dots") 
        .selectAll("cirlces") 
        .data(myPie(data)) 
        .enter() 
        .append("circle") 
        .attr("class", "g.dots") 
        .attr("transform", function(d) 
        { 
        return "translate(" + bigArcMaker.centroid(d) + ")"; 
        }) 
        .attr("r", dRadius) 
        .attr("fill", dFillColor) 
        .attr("stroke", sColor) 





//     var x1 = myArcMaker.centroid(d)[0]; 
//     var y1 = myArcMaker.centroid(d)[1]; 
//     var x2 = bigArcMaker.centroid(d)[0]; 
//     var y2 = bigArcMaker.centroid(d)[1]; 
//     var x3 = function(d){if(x2<0){return bigArcMaker.centroid(d)[0]-160}} 

//     var lineData = [{'x': x1}, 
//         ] 


        var polyLines = mySvg.select(".polyLines") 
        .selectAll("polylines") 
        .data(data) 
        .enter() 
        .append("polyline") 
        .attr("class", "polyLines") 
        .attr("points", function(d) 
        { 
         return 
          myArcMaker.centroid(d)[0] + ',' + myArcMaker.centroid(d)[1] + ',' 
          + bigArcMaker.centroid(d)[0] + ',' + bigArcMaker.centroid(d)[1] + ','+ 

          (bigArcMaker.centroid(d)[0] < 0) 
         ? (bigArcMaker.centroid(d)[0] - 160) : (bigArcMaker.centroid(d)[0] + 160) + ',' + 
          bigArcMaker.centroid(d)[1] 


        }) 
        .attr("fill", "#ccc") 
        .attr("stroke", sColor)  
      } 
     </script> 
    </body> 
</html> 

我有折線被追加到我的SVG,當我在Chrome中使用檢查元素,但他們arent顯示出來,他們沒有分。這讓我相信它與我的條件陳述有關,有沒有我沒有看到的東西?我是新來的d3和JavaScript所以它可能我只寫了整個條件語句錯了。

+0

什麼條件? –

+0

'(bigArcMaker.centroid(d)[0] <0) ? (bigArcMaker.centroid(d)[0] - 160):(bigArcMaker.centroid(d)[0] +160)+','+ bigArcMaker.centroid(d)[1]' –

+0

Ew;該代碼很難閱讀或推理:(我會考慮做一些重構,如果沒有其他的話,你可以把'bigArcMaker.centroid(d)'放到一個臨時變量中,例如https://gist.github。 com/anonymous/f3e40285932afa91b690。這使得事情變得更容易測試和推理 –

回答

0

夫婦的事情。

1.)當您生成多段線時,您忘記了在數據綁定中「餡餅」您的數據。

2.)由於字符串連接,您的條件會在某處丟失。我建議你重新編寫成喜歡的東西可讀:

.attr("points", function(d) { 

     var p = ""; 
     p += myArcMaker.centroid(d)[0] + ',' + myArcMaker.centroid(d)[1] + ',' + bigArcMaker.centroid(d)[0] + ',' + bigArcMaker.centroid(d)[1] + ','; 
     p += bigArcMaker.centroid(d)[0] < 0 ? bigArcMaker.centroid(d)[0] - 160 : bigArcMaker.centroid(d)[0] + 160; 
     p += ',' + bigArcMaker.centroid(d)[1]; 
     return p; 

    }) 

工作代碼:

<!DOCTYPE html> 
 
<html> 
 

 
    <head> 
 
    <title>Page Title</title> 
 
    <meta charset="UTF-8" /> 
 
    <script data-require="[email protected]" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script> 
 
    </head> 
 

 
    <body> 
 
    <script type="text/javascript"> 
 
    //========================================================================================================================================= 
 
    // initializing variables 
 

 

 
    var data = []; // empty array to hold the objects imported from the JSON file 
 
    var oRadius = 300; //var holding value for the outer radius of the arc 
 
    var iRadius = 80; //var holding the value for the inner radius of the arc 
 
    var cRadius = 3; //var holding the value for the corner radius of the arc 
 
    var colors = d3.scale.category20b(); //built in D3 function to color pieces of data 
 
    var width = 1400; //setting the width of the svg 
 
    var height = 1000; //setting the height of the svg 
 
    var dRadius = 5; //setting the radius for the dots 
 
    var sColor = "white"; // color for the stroke of the arcs 
 
    var dStrokeColor = "#666"; 
 
    var dFillColor = "#ccc" 
 

 

 
    var lineMaker = d3.svg.line().x(function(d) { 
 
     return d.x; 
 
    }).y(function(d) { 
 
     return d.y; 
 
    }).interpolate("linear"); 
 

 
    var myArcMaker = d3.svg.arc().outerRadius(oRadius).innerRadius(iRadius).cornerRadius(cRadius); //var that creates the arc 
 

 
    var bigArcMaker = d3.svg.arc().outerRadius(400).innerRadius(oRadius).cornerRadius(cRadius); 
 

 
    var mySvg = d3.select('body') 
 
     .append('svg') 
 
     .attr('width', width) 
 
     .attr("height", height) //selecting the body and appending an, then svg setting the height and width properties for the svg 
 
     .append("g") 
 
     .attr("transform", "translate(" + width/2 + "," + height/2 + ")") // centers the pie chart in the center of the svg 
 

 

 
    mySvg.append("g") 
 
     .attr("class", "slices"); 
 
    mySvg.append("g") 
 
     .attr("class", "dots"); 
 
    mySvg.append("g") 
 
     .attr("class", "lines"); 
 
    mySvg.append("g") 
 
     .attr("class", "polyLines"); 
 

 
    var myPie = d3.layout.pie() 
 
     .sort(null) 
 
     .startAngle(2 * (Math.PI)) 
 
     .endAngle(((Math.PI))/360) 
 
     .padAngle(-1.5 * (2 * (Math.PI))/360).value(function(d) { 
 
     return d.value 
 
     }); //setting the values for that start angle, end angle and pad angle for the arcs and takes in the the values from the objects in the data array 
 

 

 
    data= [{ 
 
     value: 10 
 
    },{ 
 
     value: 20 
 
    },{ 
 
     value: 30 
 
    }]; 
 
    visual(); 
 
    
 

 
    //====================================================================================================================================================== 
 

 
    function visual() // this function prevents the code that creates the arc from running before the objects from the json file are added into the empty data array 
 
    { 
 
     var slice = mySvg.select(".slices") 
 
     .selectAll("path.slice") 
 
     .data(myPie(data)) // 
 
     .enter() 
 
     .append("path") 
 
     .attr("class", "slice") 
 
     .attr("d", function(d) { 
 
      return myArcMaker(d) 
 
     }) 
 
     .attr("fill", function(d, i) { 
 
      return colors(i); 
 
     }) //using the d3 color brewer to color each arc 
 
     .attr("stroke", "white") //giving each arc a stroke of white 
 

 
     var dots = mySvg.select("g.dots") 
 
     .selectAll("cirlces") 
 
     .data(myPie(data)) 
 
     .enter() 
 
     .append("circle") 
 
     .attr("class", "g.dots") 
 
     .attr("transform", function(d) { 
 
      return "translate(" + myArcMaker.centroid(d) + ")"; 
 
     }) 
 
     .attr("r", dRadius) 
 
     .attr("fill", dFillColor) 
 
     .attr("stroke", sColor) 
 
     //     
 
     var lines = mySvg.select(".lines") 
 
     .selectAll("path.lines") 
 
     .data(myPie(data)) // 
 
     .enter() 
 
     .append("path") 
 
     .attr("class", "lines") 
 
     .attr("d", function(d) { 
 
      return bigArcMaker(d) 
 
     }).attr("fill", "none") 
 
     .attr("stroke", "white") 
 

 

 
     var outerDots = mySvg.select("g.dots") 
 
     .selectAll("cirlces") 
 
     .data(myPie(data)) 
 
     .enter() 
 
     .append("circle") 
 
     .attr("class", "g.dots") 
 
     .attr("transform", function(d) { 
 
      return "translate(" + bigArcMaker.centroid(d) + ")"; 
 
     }) 
 
     .attr("r", dRadius) 
 
     .attr("fill", dFillColor) 
 
     .attr("stroke", sColor) 
 

 

 
     var polyLines = mySvg.select(".polyLines") 
 
     .selectAll("polylines") 
 
     .data(myPie(data)) 
 
     .enter() 
 
     .append("polyline") 
 
     .attr("class", "polyLines") 
 
     .attr("points", function(d) { 
 
      
 
      var p = ""; 
 
      p += myArcMaker.centroid(d)[0] + ',' + myArcMaker.centroid(d)[1] + ',' + bigArcMaker.centroid(d)[0] + ',' + bigArcMaker.centroid(d)[1] + ','; 
 
      p += bigArcMaker.centroid(d)[0] < 0 ? bigArcMaker.centroid(d)[0] - 160 : bigArcMaker.centroid(d)[0] + 160; 
 
      p += ',' + bigArcMaker.centroid(d)[1]; 
 
      return p; 
 
      
 
     }) 
 
     .attr("fill", "#ccc") 
 
     .attr("stroke", sColor) 
 
    } 
 
    </script> 
 
    </body> 
 

 
</html>

+0

感謝男人,我最初有「派」,但只是試圖用我自己的奇怪的方式進行調試,你能解釋你對var p ?我只是不去複製你的代碼,而不理解它的實際做法,當然對你沒有任何問題 –

+0

'p'只是一個字符串變量,我將你的' points'屬性,爲了提高可讀性和防止JavaScript「猜測」如何連接,最好將條件分開(而不是在連接中)。 – Mark