宝哥软件园

D3.js实现简单实用的动态仪表盘示例

编辑:宝哥软件园 来源:互联网 时间:2021-08-31

本文介绍了一个D3.js实现简单实用的动态仪表盘的例子,分享给大家如下:

动态渲染:

仪表板渲染

仔细观察上面的动态渲染图,我们可以发现:

当一个价值转化为新的价值,是一个渐进的过程;弧的末端有一条垂直线作为仪表盘的指针,当仪表盘数值变化时有弹性动画效果。一开始,我用Echarts实现了仪表板,但是它不能满足以上两个要求。因此,改为使用D3.js。

D3.js可以完美定制图表,从细节上完美满足我们的需求。

初始化仪表板

1.首先,定义一个svg元素:

Svg id='我的仪表'宽度=' 80 '高度=' 108'/SVG然后,声明一些变量进行初始化:

Var width=80,height=108,svg的高度和宽度。还可以得到内半径=22,外半径=30,//圆弧的内外半径arcMin=-Math。PI*2/3通过SVG的宽度和高度属性。ArcMax=数学。PI*2/3,//弧2的起始角和终止角。创建一个圆弧方法,并设置除“圆弧”以外的所有属性。创建圆弧时,将包含endAngle属性的对象传递给此方法,可以计算给定角度的SVG路径。

如何设置var arc=d3.arc()的弧角?内半径(22)。外半径(30)。起始角度(弧最小值)?

当一个圆对应一个时钟时,对应的12点的角度是0,顺时针3点的角度是math.pi,逆时针6点的角度是-数学,因此,弧的形状来自-数学。数学的* 2/3。PI*2/3如上图所示。有关更多信息,请参见API文档中的arc.startAngle。

3.获取SVG元素,并将原点转换到画布的中心,这样我们以后创建圆弧时就不需要单独指定它们的位置了。

var SVG=D3 . select(' # myGauge ')var g=SVG . append(' g ')。attr('transform ',' translate '(width/2 ',' height/2 '));4.在仪表板中添加文本(标题、值、单位)

//添加标题g.append ('text ')。attr ('class ',' gauge-title ')。相对于父元素对齐的样式(‘对齐-基线’,‘中心’)//的样式。style ('text-anchor ',' middle ')//text anchor//添加仪表板上显示的数值,并声明变量var valuelabel=g. append ('text ')。attr ('class ',' gauge-value ')。相对于父元素对齐的样式('对齐-基线',中心')//等。样式('文本锚','中间')//文本锚,居中。attr('y ',25) //到中心的距离。正文(12.65);//添加仪表板显示数值g . append(' text ' %)的单位。attr ('class ',' gauge-unity ')。相对于父元素对齐的样式(‘对齐-基线’,‘中心’)//的样式。样式(' text-anchor ',' middle')//text与Echarts绘制的Canvas相比,D3制作的SVG绘图有一个重要的优势,那就是SVG的样式可以用CSS来定义。例如,此处仪表板标题的样式如下:仪表标题{ font-size : 10px;fill: # A1A6AD}5.添加背景弧

//添加背景弧var background=g. append ('path ')。datum({ endAngle : arcmax })//将endangle参数传递给arc方法。样式('填充',' # 44851 ')。attr ('d ',arc);6.添加一个表示百分比的弧线,其中百分比是要表示的百分比,从0到1为十进制。

//计算弧的结束角度var当前角度=百分比*(arcmax-arcmin)arcmin//添加另一层弧来表示百分比var前景=g. append ('path ')。基准({endangle:当前角度})。样式('填充',' # 444851。7.在弧的末端添加指针标记

var tick=g.append('line ')。attr('class ',' gauge-tick ')。attr('x1 ',0)。attr('y1 ',-innerRadius)。attr('x2 ',0)。attr('y2 ',-(内半径12)//定义直线位置,默认为圆弧中间,12为指针长度。样式(' stroke ',' # a1a6ad ')。attr ('transform ',' rotate(' angletoddegree(current tangle)')' rotate中的参数是度数,而Math。PI对应180,所以需要自定义一个angletodegree方法来转换currentangle。

至此,制作了一个SVG仪表盘,但它仍然是,那么如何更新这个仪表盘呢?

更新仪表板

需要更新:代表新百分比的弧线;弧下面的值。

修改弧下面的值很简单:

ValueLabel.text(newValue)更新arc有点麻烦。具体思路是修改圆弧的角度和圆弧末端指针的变换值。

在实施过程中,要使用的应用编程接口:

selection . transition:https://github.com/D3/D3-transition/blob/master/readme . MD # selection _ transition transition . attr twin:https://github.com/D3/D3-transition/blob/master/readme . MD # transition _ attr twin D3 . INTERPOL:https://github.com/D3-INTERPOL/blob/master/readme . MD # INTERPOL

1.更新弧,其中角度是新弧的结束角度。

//更新弧线,设置渐变效果前景。过渡()。持续时间(750)。轻松(d3。缓和弹性)//设置反弹效果。at tween(' d ',arcTween(角度));arcTween方法的定义如下。它返回一个D属性的补间(渐变)动画方法,从当前角度到另一个新角度做一个弧形渐变。

arcTween(newAngle) {让self=这个返回函数(d){ var INTERPOL=D3 . INTERPOL(d . endangle,new angle);//求一个插值返回函数(t){ d . endangle=INTERPOL(t);//根据过渡时间t计算插值,赋给endAngle返回弧(d);//返回新的“d”属性值};};}有关此方法的更详细描述,请参考Arc Tween中的注释。

2.更新弧末端指针的原理同上,其中oldAngle为旧弧的末端角度。

//更新弧末指针标记,设置渐变效果勾号。过渡()。持续时间(750)。轻松(d3。缓和弹性)//设置反弹效果。attrtween ('transform ',function(){//设置“transform”属性的渐变。原理与上述arcTween方法var i=d3相同。插值(angletodegree(旧角度),angletodegree(新角度));//取插值返回函数(t){ return ' rotate(' I(t)')' };})至此,我们已经成功制作了一个动态刷新的SVG仪表盘,介绍很漂亮。

目标

每次使用D3.js的时候,都会忍不住觉得它这么强大,这么有趣~就像一个百宝箱,让我们可以最大程度的满足自己的需求。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+