D3.js 线段生成器 (V3版本)

线段生成器

与线段生成器相关的方法:

d3.svg.line()

//创建一个线段生成器。

line(data)

//使用线段生成器绘制data数据。

line.x([x])

//设置或获取线段x坐标的访问器,即使用什么数据作为线段的x坐标。

line.y([y])

//同上。设置或获取y坐标的访问器。

line.interpolate([interpolate])

//设置或获取线段的插值模式,共有13种。

line.tension([tension])

//设置或获取张力系数,当插值模式为cardinal、cardinal-open、cardinal-closed的时候有效。

line.defined([defined])

//设置或获取一个访问器,用于确认线段是否存在,只有判定为存在的数据才会被绘制。

line.xline.y可制定规则:如何从数据中获取x和y坐标。这种方法称为访问器

line.xline.y的默认为:

1 function x(d){
2 return d[0]       //第一个值是x坐标
3 }
4
5 function y(d){
6 return d[1]       //第二个值是y坐标
7 }

在SVG区域里,线段元素是:

1 <line x1="20" y1="20" x2="300" y2="100" />

添加元素时,可以使用append(),再设置属性,如:

1  svg.append("line")
2             .attr("x1",20)
3             .attr("y1",20)
4             .attr("x2",300)
5             .attr("y2",100)

还有一种添加直线的方法:使用路径元素<path>。路径元素也是可以绘制直线的,例如,相同的直线可用:

1 <path d="M20,20L300,100" />

换成D3添加元素的方式,代码:

1 svg.append("path")
2             .attr("d","M20,20L300,100")

这样做虽然是成功绘制了该路径,但有一个问题:类似M20,20L300,100的字符串,是怎么得到的呢?此处只有两个点,可以手动输入。如果有成百上千各店,全部手动输入,不太方便也不太现实。因此D3中引入了路径生成器(Path Generator)的概念,能够自动根据数据生成路径。用于生成线段的程序,叫做线段生成器(Line Generator)

线段生成器由d3.svg.line()创建,先看一个简单的例子:

 1 //创建一个svg画图区域
 2         var svg = d3.select("#body")
 3                     .append("svg")
 4                     .attr("width",600)
 5                     .attr("height",400)
 6
 7         //线段的点数据,每一项是一个点的x和y坐标
 8         var lines = [[80,80],[200,100],[200,200],[100,200]]
 9         //创建一个线段生成器
10         var linePath = d3.svg.line()
11
12         //添加路径
13         svg.append("path")
14             .attr("d",linePath(lines))      //使用了线段生成器
15             .attr("stroke","black")         //线的颜色
16             .attr("stroke-width","3px")     //线的宽度
17             .attr("fill","none")            //填充颜色为none

线段的数据有四个点,保存在变量lines里。线段生成器保存在变量linePath里,如此linePath可当做函数使用:linePath(lines)根据数据lines生成路径。结果是一段折现。效果图:

根据上面的例子,我们对x和y访问器做一些修改:

 1  //创建一个svg画图区域
 2         var svg = d3.select("#body")
 3                     .append("svg")
 4                     .attr("width",600)
 5                     .attr("height",400)
 6
 7
 8         var lines = [80,120,160,200,240,280]
 9         var linePath = d3.svg.line()
10                         .x(function(d){return d})
11                         .y(function(d,i){
12                             return i%2 == 0? 40 : 120
13                         })
14
15         //添加路径
16         svg.append("path")
17             .attr("d",linePath(lines))      //使用了线段生成器
18             .attr("stroke","black")         //线的颜色
19             .attr("stroke-width","3px")     //线的宽度
20             .attr("fill","none")            //填充颜色为none

如此,调用linePath(lines)所得的路径中,各顶点为:(80,40)、(120,120)、(160,40)、(200,120)、(240,40)、(280,120)。以第一个点为例讲一下:

x = 80 (d等80)

y = 0 % 2 == 0 ? 40 : 120 (i等于0,最终表达式的值为40)

以此类推,可计算得到各坐标点。结果如图:

线段生成器是有插值模式的,根据模式的不同,线段的形式(路径)会发生很大的变化。更有13中模式,如linearlinear-closedstepbasisbundlecardinalcardinal-opencardinal-closedmonotone等。设置方法如下:

1 var linePath = d3.svg.line()
2                 .interpolate("linear-closed")

插值模式,指的是对于线段两个端点之间的值如何计算。默认的插值模式是linear,即线性的。interpolate的参数,除预定义的13种模式之外,还可以是一个自己定义的函数。接下来看看线性插值模式(linear)的实现方法:

1 function interpolateLinear(points){
2     return points.join("L")
3 }

意思是:对于所有的顶点,在顶点数值之间插入一个L作为分隔。其他所有的模式都是使用类似的手法实现的。如下图展示了不同插值模式下线段的形态,虽然有些已经不是"线段"了,但都是根据线段的顶点生成的。当插值模式为cardinalcardinal-opencardinal-closed的时候,可是使用tension()设置张力系数。代码:

step插值模式 :

 1  //创建一个svg画图区域
 2         var svg = d3.select("#body")
 3                     .append("svg")
 4                     .attr("width",600)
 5                     .attr("height",400)
 6
 7
 8         //step插值模式
 9         var lines = [80,120,160,200,240,280]
10         var linePath = d3.svg.line()
11                         .interpolate("step")
12                         .x(function(d){return d})
13                         .y(function(d,i){
14                             return i%2 == 0? 40 : 120
15                         })
16
17
18         //添加路径
19         svg.append("path")
20             .attr("d",linePath(lines))      //使用了线段生成器
21             .attr("stroke","black")         //线的颜色
22             .attr("stroke-width","3px")     //线的宽度
23             .attr("fill","none")            //填充颜色为none

效果图:

basis插值模式 :

 1 //创建一个svg画图区域
 2         var svg = d3.select("#body")
 3                     .append("svg")
 4                     .attr("width",600)
 5                     .attr("height",400)
 6
 7
 8         //basis插值模式
 9         var lines = [80,120,160,200,240,280]
10         var linePath = d3.svg.line()
11                         .interpolate("basis")
12                         .x(function(d){return d})
13                         .y(function(d,i){
14                             return i%2 == 0? 40 : 120
15                         })
16
17         //添加路径
18         svg.append("path")
19             .attr("d",linePath(lines))      //使用了线段生成器
20             .attr("stroke","black")         //线的颜色
21             .attr("stroke-width","3px")     //线的宽度
22             .attr("fill","none")            //填充颜色为none

效果图:

cardinal插值模式 :

 1  //创建一个svg画图区域
 2         var svg = d3.select("#body")
 3                     .append("svg")
 4                     .attr("width",600)
 5                     .attr("height",400)
 6
 7          //cardinal插值模式
 8          var lines = [80,120,160,200,240,280]
 9          var linePath = d3.svg.line()
10                          .interpolate("cardinal")
11                          .x(function(d){return d})
12                          .y(function(d,i){
13                              return i%2 == 0? 40 : 120
14                          })
15
16
17         //添加路径
18         svg.append("path")
19             .attr("d",linePath(lines))      //使用了线段生成器
20             .attr("stroke","black")         //线的颜色
21             .attr("stroke-width","3px")     //线的宽度
22             .attr("fill","none")            //填充颜色为none

效果图 :

如果选择性的使用顶点数据,可用defined()。举个例子:

 1   //创建一个svg画图区域
 2         var svg = d3.select("#body")
 3                     .append("svg")
 4                     .attr("width",600)
 5                     .attr("height",400)
 6
 7         //选择性的使用顶点数据
 8         var lines = [80,120,160,200,240,280]
 9         var linePath = d3.svg.line()
10                         .x(function(d){return d})
11                         .y(function(d,i){
12                             return i%2 == 0 ? 40 : 120
13                         })
14                         .defined(function(d){
15                             return d < 200
16                         })
17
18         //添加路径
19         svg.append("path")
20             .attr("d",linePath(lines))      //使用了线段生成器
21             .attr("stroke","black")         //线的颜色
22             .attr("stroke-width","3px")     //线的宽度
23             .attr("fill","none")            //填充颜色为none

效果图 :

原文地址:https://www.cnblogs.com/littleSpill/p/10850364.html

时间: 2024-10-09 09:57:49

D3.js 线段生成器 (V3版本)的相关文章

D3.js 弧生成器 (V3版本)

弧生成器(Arc Generator) 弧生成器(Arc Generator)可凭借起始角度.终止角度.内半径.外半径等,生成弧线的路径,因此在制作饼状图.弦图等图表时很常用. 有四个访问器需要谨记:内半径访问器innerRadius().外半径访问器outerRadius().起始角度访问器startAngle().终止角度访问器endAngle().各参数的意义如图: startAngle和endAngle的单位是弧度,即:0°要用0,180°要用3.1415926(π).0°的位置在"时钟

D3.js 动画 过渡效果 (V3版本)

一 . 过渡的启动 启动过渡效果,与以下四个方法相关: d3.transition([selection],[name]) //创建一个过渡对象.但是由于每个选择集中都有transition()方法,可用d3.select("rect").transition()的方式来创建过渡,因此一般不直接用d3.transition(). transition.delay([delay]) //设定延迟的时间.过渡会经过一定时间后才开始发生.单位是毫秒. transition.duration(

D3.js的v5版本入门教程(第十三章)—— 饼状图

D3.js的v5版本入门教程(第十三章) 这一章我们来绘制一个简单的饼状图,我们只绘制构成饼状图基本的元素——扇形.文字,从这一章开始,内容可能有点难理解,因为每一章都会引入比较多的难理解知识点,在这里作者本人也只是粗略的讲解每个新知识点的意思!如果不是很理解的话,需要读者自行查看官网API 为了绘制一个饼状图,我们还是需要以下新的知识点 d3.arc( {} ),弧形生成器,用以绘制弧形,需要传入一些用以绘制弧形基本的数据的对象,例如,该对象的属性可以包括(我用官网api的示例) d3.pie

D3.js的v5版本入门教程(第十二章)—— D3.js中各种精美的图形

D3.js的v5版本入门教程(第十二章) D3中提供了各种制作常见图形的函数,在d3的v3版本中叫布局,通过d3.layout.xxx,来新建,但是到了v5,新建一个d3中基本的图形的方式变了(我也并不知道是不是还叫布局,我觉得也可以这么叫,反正布局指的也是一个绘图函数) 下面是d3中一些常见的部分图形 bubble —— 泡泡图 packing —— 打包图 bundling —— 捆图 force —— 力导向图 chord —— 弦图 pie——饼状图 tree——树状图 中国地图 我们利

D3.js的v5版本入门教程(第七章)—— 比例尺的使用

D3.js的v5版本入门教程(第七章) 比例尺在D3.js中是一个很重要的东西,我们可以这样理解d3.js中的比例尺——一种映射关系,从domain映射到range域(为什么会是domain和range呢?等一下你就会看到,因为我们在建立比例尺是常常会用到domain()和range()两个函数,当然不是绝对的,D3中有很多类型的比例尺) 下面介绍在本套教程中常用的两种比例尺 线性比例尺序数比例尺        线性比例尺 domain域和range域都可以连续变化 <body> <sc

D3.js的v5版本入门教程(第十章)

在这一章我们干点有趣的事——让我们上一章绘制的图表动起来,这样岂不是很有意思 为了让图表动起来,我们还是需要以下新的知识点 .attr(xxx) .transition() .attr(xxx),transition()表示添加过渡,也就是从前一个属性过渡到后一个属性.duration(2000),表示过渡时间持续2秒.delay(500),表示延迟0.4秒后再进行过渡.ease(d3.easeElasticInOut)表示过渡方式,注意这里和v3版本的区别    有了上面的基础知识后,现在我们

D3.js的v5版本入门教程(第九章)——完整的柱状图

D3.js的v5版本入门教程(第九章) 一个完整的柱状图应该包括的元素有——矩形.文字.坐标轴,现在,我们就来一一绘制它们,这章是前面几章的综合,这一章只有少量新的知识点,它们是 d3.scaleBand():这也是一个坐标轴,可以根据输入的domain的长度,等分rangeRound域(类比range域)d3.range():这个比较复杂,建议去看百度(或者官方API),在这里我只讲一下这个返回一个等差数列    1.得到SVG画布 var marge = {top:60,bottom:60,

D3.js的v5版本入门教程(第五章)—— 选择、插入、删除元素

D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有三个<p>,如下 <p>dog</p> <p>cat</p> <p>pig</p> <p>rat</p> 选择第一个元素<p> var p = d3.select("body&qu

D3.js的v5版本入门教程(第十一章)——交互式操作

D3.js的v5版本入门教程(第十一章) 与图形进行交互操作是很重要的!所谓的交互操作也就是为图形元素添加监听事件,比如说当你鼠标放在某个图形元素上面的时候,就会显示相应的文字,而当鼠标移开后,文字就会消失,或者鼠标单击一下某图形元素就会使它动起来 为了与图形元素进行交互操作,我们还是需要以下新的知识点 on("eventName",function):该函数是添加一个监听事件,它的第一个参数是事件类型,第二个参数是响应事件的内容d3.select(this),选择当前元素    常见