在d3js中生成箭头

时间:2015-08-29 19:47:13

标签: javascript d3.js svg

我正在尝试使用.append("svg:marker")在每行的末尾生成简单的箭头。我显然做错了什么 - 非常感谢。

A link to bl.ocks example .



var svg = d3.select("body") // select the 'body' element
      .append("svg")           // append an SVG element to the body
      .attr("width", 600)      
      .attr("height", 600);   


d3.csv("data/myarrows.csv", dottype1, function(error, lines) {
  
svg.append("g")
      .selectAll("line")
      .data(lines)
      .enter()
      .append("line")
      .attr("x1", function(d) { return d.x1; })
      .attr("y1", function(d) { return d.y1; })
      .attr("x2", function(d) { return d.x2; })
      .attr("y2", function(d) { return d.y2; })
      .style("stroke", "brown")           // colour the line
      .style("stroke-width", 4)          // adjust line width
      .style("stroke-linecap", "square") // stroke-linecap type
      

svg.append("g")
      .selectAll("marker")
      .data(lines)
      .enter()
      .append("svg:marker") 
      .attr('viewBox', '0 -5 10 10')
        .attr('refX', 6)
        .attr('markerWidth', 10)
        .attr('markerHeight', 10)
        .attr('orient', 'auto')
        .append('svg:line')
        .attr('d', 'M0,-5L10,0L0,5')
                 ;
});




function dottype1(d) {
  d.x1 = +d.x1x1;
  d.y1 = +d.y1y1;
  d.x2 = +d.x2x2;
  d.y2 = +d.y2y2;
   return d;
}

<!DOCTYPE html>
<html>
<head>
    <title>Arrows</title>
    <meta charset="utf-8" />

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

</head>


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

  </script>

</body>
</html>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

有很多错误:

  1. 您只需要一个标记,然后通过其ID引用。见docs
  2. 标记应位于defs而不是g,但它并不重要。
  3. 您使用line代替path,但只有path具有d属性。
  4. 在代码中,这意味着:

    svg.append("g")
          .selectAll("line")
          .data(lines)
          .enter()
          .append("line")
          .attr("x1", function(d) { return d.x1; })
          .attr("y1", function(d) { return d.y1; })
          .attr("x2", function(d) { return d.x2; })
          .attr("y2", function(d) { return d.y2; })
          .attr("marker-end", "url(#triangle)") // add the marker
          .style("stroke", "brown")           // colour the line
          .style("stroke-width", 4)          // adjust line width
          .style("stroke-linecap", "square") // stroke-linecap type
                   ;
    
    svg.append("svg:defs")
          .append("svg:marker") 
          .attr("id", "triangle")
          .attr('viewBox', '0 -5 10 10')
          .attr('refX', 6)
          .attr('markerWidth', 10)
          .attr('markerHeight', 10)
          .attr('orient', 'auto')
          .append('svg:path')
            .attr('d', 'M0,-5L10,0L0,5')
                     ;
    });
    

    我没有测试过这段代码,但我只在devtools中手动尝试过。