摘要:图表是数据表示的一种直观的形式,前端开发经常回合图表打交道,一般都会借用第三方的库,如等,但如果只是很简单的图标,我们完全可以自己绘制,现在我们来绘制一个简单的百分比展示图表最终效果如下代码额,很简单,随便放在某个地方分析从最终效果来看,这
图表是数据表示的一种直观的形式,前端开发经常回合图表打交道,一般都会借用第三方的js库,如echats、bizchats等,
但如果只是很简单的图标,我们完全可以自己绘制,现在我们来绘制一个简单的百分比展示图表
额,很简单,随便放在html某个地方
分析从最终效果来看,这个图表由6部分组成
1.最大的外圈
2.最中心向外的内二圈
3.最里面的内圈
4.带颜色的多个圆弧组成的彩圈
5.中心的指针
6.数字文字
下来就按照顺序绘制出来
配置首先还是写一些可配置的变量
let r = 100, //半径 cx = 0, //圆心位置 cy = 0, parts = [ //彩条 "#78C77C","#F3D263","#FC9136","#FB574A","#AE1A51","#8F66DD" ], texts = [ //文字段落 0,30,60,90,120,150 ], pad = 1/100, //间隙 data = 0.5 //数据,百分比,20%应写成0.2初始化
let canvas = document.getElementById("chart") canvas.width = 262; canvas.height = 262; let ctx = canvas.getContext("2d") ctx.translate(canvas.width/2,canvas.height/2); ctx.save() ctx.rotate(0.5*Math.PI)
为什么要旋转0.5π呢,因为为了便于计算,需要把圆的起始位置转至最下
绘制-外圈ctx.beginPath() ctx.arc(cx,cy,r+30,0,2*Math.PI) ctx.fillStyle="#fff" ctx.strokeStyle="gray" ctx.shadowOffsetX = 0; // 阴影Y轴偏移 ctx.shadowOffsetY = 0; // 阴影X轴偏移 ctx.shadowBlur = 1; // 模糊尺寸 ctx.shadowColor = "rgba(0, 0, 0, 0.5)"; // 颜色 ctx.stroke(); ctx.fill();效果 绘制-内二圈
ctx.beginPath() ctx.arc(cx,cy,r-20,0,2*Math.PI) ctx.fillStyle="#F2F1F3" ctx.fill();效果 注意
为什么不先绘制最内层的圈,因为canvas的层级关系是后来者居上,所以有重叠的部分最上面的图形最后绘制
绘制-内圈ctx.beginPath() ctx.arc(cx,cy,r-20-30,0,2*Math.PI) ctx.fillStyle="#fff" ctx.strokeStyle="#fff" ctx.stroke(); ctx.fill();效果 绘制-彩圈
这里可以理解为多个同心圆弧,把2π等分,中间有相同的间隔
let startRad = 0 let partRad = ( 2 - (pad*parts.length) ) / parts.length parts.forEach((color,index)=>{ if (index===0) { startRad += pad/2 } else { startRad += pad + partRad } ctx.beginPath() ctx.strokeStyle = color ctx.lineWidth = 20 ctx.arc(cx,cy,r,startRad * Math.PI,(startRad+partRad)*Math.PI) ctx.stroke() }) ctx.restore();注意
1.等分2π的时候别忘了间隔
2.下一个圆弧的起始点是上一个圆弧的终点加上间隔
ctx.save(); ctx.rotate(data*2*Math.PI) ctx.beginPath() ctx.moveTo(-6,0) ctx.lineTo(0,r-30) ctx.lineTo(6,0) ctx.closePath(); ctx.fillStyle = "#4394F8"; ctx.fill(); ctx.beginPath() ctx.arc(0,0,10,0,2*Math.PI) ctx.fillStyle = "#F4F6F9"; ctx.strokeStyle = "gray" ctx.strokeWidth = 1 ctx.shadowOffsetX = 0; // 阴影Y轴偏移 ctx.shadowOffsetY = 0; // 阴影X轴偏移 ctx.shadowBlur = 10; // 模糊尺寸 ctx.shadowColor = "#F4F6F9"; // 颜色 ctx.stroke() ctx.fill(); ctx.restore();注意
1.指针由2部分构成,中心的圆形和三角形
2.注意是圆形在上,三角形在下,所以最后绘制圆形
ctx.save() ctx.rotate(0.5*Math.PI) let beginRotate = 0, textPartRad = 2/(texts.length) texts.forEach((text,index)=>{ if (index!=0) { beginRotate = beginRotate + textPartRad } ctx.save(); ctx.beginPath() ctx.font = "15px" ctx.textAlign = "center" ctx.textBaseline = "middle" ctx.translate(cx+Math.cos(beginRotate*Math.PI)*(r-35),cy+Math.sin(beginRotate*Math.PI)*(r-35)); ctx.rotate(beginRotate*Math.PI+(-0.5*Math.PI)) ctx.rotate(Math.PI) ctx.fillText(text,0,0) ctx.restore(); }) ctx.restore();注意
1.每个文字先放到最中间(0,0)
2.然后根据圆的半径和文字放置地点的旋转角度,通过三角函数计算出位置,然后移动
3.根据旋转角度将文字旋转到合适位置
Chart
还有许多可以优化的地方,如代码中颜色,局部位置的距离等等,可以做成配置项,有时间在优化吧^_^
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/106141.html
摘要:新公司已经呆了一个多月,目前着手一个数据可视化的项目,数据可视化肯定要用到图形库如等,经决定我的这个项目用阿里旗下蚂蚁金服所开发的图表库。数据提示框内提示的信息还可以通过格式化函数动态指定。 新公司已经呆了一个多月,目前着手一个数据可视化的项目,数据可视化肯定要用到图形库如D3、Highcharts、ECharts、Chart等,经决定我的这个项目用阿里旗下蚂蚁金服所开发的G2图表库。...
阅读 1858·2021-09-22 15:29
阅读 3350·2019-08-30 15:44
阅读 3557·2019-08-30 15:43
阅读 1762·2019-08-30 13:48
阅读 1488·2019-08-29 13:56
阅读 2473·2019-08-29 12:12
阅读 964·2019-08-26 11:35
阅读 1050·2019-08-26 10:25