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

弧生成器(Arc Generator)

弧生成器(Arc Generator)可凭借起始角度、终止角度、内半径、外半径等,生成弧线的路径,因此在制作饼状图、弦图等图表时很常用。

有四个访问器需要谨记:内半径访问器innerRadius()、外半径访问器outerRadius()、起始角度访问器startAngle()、终止角度访问器endAngle()。各参数的意义如图:

startAngleendAngle的单位是弧度,即:0°要用0,180°要用3.1415926(π)。0°的位置在"时钟零点"处,终止角度是按照顺时针旋转的。outerRadius表示外弧半径,innerRadius表示内弧半径,内弧之内的部分不属于弧的一部分。看代码:

 1      var width = 800;
 2         var height = 600;
 3
 4         var svg = d3.select("#body")
 5                     .append("svg")
 6                     .attr("width",width)
 7                     .attr("height",height)
 8
 9         //定义一个对象
10         var dataList = {startAngle:0,endAngle:Math.PI * 0.75};
11
12         //创建一个弧生成器
13         var arcPath = d3.svg.arc()
14                         .innerRadius(50)
15                         .outerRadius(100)
16         //添加路径
17         svg.append("path")
18             .attr("d",arcPath(dataList))
19             .attr("transform","translate(250,200)")
20             .attr("stroke","black")
21             .attr("stroke-width","3px")
22             .attr("fill","yellow")

dataList是一个对象,成员变量有两个:startAngleendAngle。然后,创建一个弧生成器arcPath,设置其内半径和外半径访问器,分别为常量50和100.没有设置startAngleendAngle的访问器。默认使用目标对象中名称为startAngleendAngle的变量。最后,添加一个路径元素,将弧生成器计算所得到的路径作为属性d的值。结果如图:

看见效果图,有人可能会联想到这是饼状图的一部分。不错,饼状图正是用弧生成器绘制的。只需在数据中多添加几段弧,令其startAngle和endAngle成首尾相连的形式,合计360°即可。定义饼状图的代码:

1  //定义一个对象
2         var dataList = [
3             {startAngle : 0 , endAngle : Math.PI * 0.6},
4             {startAngle : Math.PI * 0.6 , endAngle : Math.PI},
5             {startAngle : Math.PI , endAngle : Math.PI * 1.7},
6             {startAngle : Math.PI * 1.7 , endAngle : Math.PI * 2}
7         ]

有四段弧,首尾相连,从0到2π。然后,插入足够数量的路径元素<path>,分别用弧生成器计算路径:

 1   //创建一个弧生成器
 2         var arcPath = d3.svg.arc()
 3                         .innerRadius(0)
 4                         .outerRadius(100)
 5
 6         //定义颜色
 7         var color = d3.scale.category10();
 8
 9
10         //插入足够数量的路径元素<path>,分别用弧生成器计算路径
11         svg.selectAll("path")
12             .data(dataList)
13             .enter()
14             .append("path")
15             .attr("d",function(d){return arcPath(d)})
16             .attr("transform","translate(250,250)")
17             .attr("stroke","black")
18             .attr("stroke-width","3px")
19             .attr("fill",function(d,i){return color(i)})

color是一个序数比例尺,按序列返回颜色。此处是为了给饼状图的每段弧上不同的颜色。弧生成器的内半径被设置为0,表示这是一个中间没有孔的饼状图,如图:

还需要给每一段弧添加一个标签文字,先确定文字的位置:arc.centroid()可计算弧的中心位置:

 1  svg.selectAll("text")
 2             .data(dataList)
 3             .enter()
 4             .append("text")
 5             .attr("transform",function(d){
 6                 return "translate(250,250)"+"translate("+arcPath.centroid(d)+")"    //计算弧的中心位置
 7             })
 8             .attr("text-anchor","middle")
 9             .attr("fill","white")
10             .attr("font-size","18px")
11             .text(function(d){
12                 return Math.floor((d.endAngle - d.startAngle)*180/Math.PI)+"°"
13             })

注意粗体字的部分,centroid()的参数是弧对象,返回值是一个二维坐标,其位置是相对于圆心而言的。添加文字之后,效果图如下, 添加的文字是每段弧对应的角度。

如果知道startAngleendAngle,可以按以上方法作图。但是一般不会知道,只会知道更加原始的数据,如:10,20,35.要将其转换成startAngle和endAngle。才能使用弧生成器来绘制。

D3提供了用于进行这种数据转换的方法,称为布局。这在以后会给大家进行介绍。

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

时间: 2024-10-27 18:18:17

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

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]) //设置或获取张力系数,当插值模式为c

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),选择当前元素    常见