【 D3.js 进阶系列 — 4.0 】 绘制箭头

在 SVG 绘制区域中作图,在绘制直线和曲线时,常需要在某处添加箭头。本文介绍如何在 D3 中给直线和曲线添加箭头。

 

到目前为止,我们绘制 D3 的图表都是在 SVG 绘制区域内,虽然 D3 也可用 Canvas 或 WebGL 等作图,但 SVG 是最常用的。那么,用 D3 来绘制箭头,先要明白在 SVG 中是怎么绘制的。

1. 在 SVG 中定义箭头的标识

定义箭头的标识如下,先写一对 <defs> ,里面再写一对 <marker>,其中 marker 的属性的意义为:

viewBox 坐标系的区域
refX, refY 在 viewBox 内的基准点,绘制时此点在直线端点上(要注意大小写)
markerUnits 标识大小的基准,有两个值:strokeWidth(线的宽度)和userSpaceOnUse(图形最前端的大小)
markerWidth, markerHeight 标识的大小
orient 绘制方向,可设定为:auto(自动确认方向)和 角度值
id 标识的id号

然后在 marker 里绘制图形即可,下面的代码中用 path 绘制了一个箭头的图形。

[javascript] view plain copy
  1. <defs>  
  2. <marker id=“arrow”   
  3.         markerUnits=“strokeWidth”   
  4.         markerWidth=“12”   
  5.         markerHeight=“12”   
  6.         viewBox=“0 0 12 12”   
  7.         refX=“6”   
  8.         refY=“6”   
  9.         orient=“auto”>  
  10.         <path d=“M2,2 L10,6 L2,10 L6,6 L2,2” style=“fill: #000000;” />  
  11. </marker>  
  12. </defs>  

 

2. 在 SVG 中绘制箭头

有了上面的标识,就可以绘制箭头了。下面绘制一条线段,在线段末尾添加箭头:

[javascript] view plain copy
  1. <line x1=“0” y1=“0” x2=“200” y2=“50”  stroke=“red” stroke-width=“2” marker-end=“url(#arrow)”/>  

也可以用 path 来绘制:

[javascript] view plain copy
  1. <path d=“M20,70 T80,100 T160,80 T200,90” fill=“white” stroke=“red” stroke-width=“2” marker-start=“url(#arrow)” marker-mid=“url(#arrow)” marker-end=“url(#arrow)”/>  

在不同的位置绘制的属性如下:

  • marker-start :路径起点处
  • marker-mid:路径中间端点处(必须是 path 中间出现的点)
  • marker-end :路径终点处

3. 使用 D3 绘制箭头

有了上面的内容,在 D3 中如何绘制呢?

先定义箭头的标识:

[javascript] view plain copy
  1. var svg = d3.select(“body”).append(“svg”)  
  2.         .attr(“width”, width)  
  3.         .attr(“height”, height);  
  4.           
  5. var defs = svg.append(“defs”);  
  6.   
  7. var arrowMarker = defs.append(“marker”)  
  8.                         .attr(“id”,“arrow”)  
  9.                         .attr(“markerUnits”,“strokeWidth”)  
  10.                         .attr(“markerWidth”,“12”)  
  11.                         .attr(“markerHeight”,“12”)  
  12.                         .attr(“viewBox”,“0 0 12 12”)   
  13.                         .attr(“refX”,“6”)  
  14.                         .attr(“refY”,“6”)  
  15.                         .attr(“orient”,“auto”);  
  16.   
  17. var arrow_path = “M2,2 L10,6 L2,10 L6,6 L2,2”;  
  18.                           
  19. arrowMarker.append(“path”)  
  20.             .attr(“d”,arrow_path)  
  21.             .attr(“fill”,“#000”);  

使用上述 marker 绘制箭头的代码为:

[javascript] view plain copy
  1. //绘制直线  
  2. var line = svg.append(“line”)  
  3.              .attr(“x1”,0)  
  4.              .attr(“y1”,0)  
  5.              .attr(“x2”,200)  
  6.              .attr(“y2”,50)  
  7.              .attr(“stroke”,“red”)  
  8.              .attr(“stroke-width”,2)  
  9.              .attr(“marker-end”,“url(#arrow)”);  
  10.   
  11. //绘制曲线  
  12. var curve_path = “M20,70 T80,100 T160,80 T200,90”;  
  13.   
  14. var curve = svg.append(“path”)  
  15.              .attr(“d”,curve_path)  
  16.              .attr(“fill”,“white”)  
  17.              .attr(“stroke”,“red”)  
  18.              .attr(“stroke-width”,2)  
  19.              .attr(“marker-start”,“url(#arrow)”)  
  20.              .attr(“marker-mid”,“url(#arrow)”)  
  21.              .attr(“marker-end”,“url(#arrow)”);  

结果图为本文开始处的图片,完整代码为:

SVG版:http://www.ourd3js.com/demo/J-4.0/arrow.svg

D3版:http://www.ourd3js.com/demo/J-4.0/arrow.html

转载自:https://blog.csdn.net/u010238381/article/details/80609365

You may also like...

退出移动版