专注连锁门店会员营销管理系统
线上+线下+进销存+收银+会员2018-05-21 作者:秩名
雷达图(Radar Chart),又可称为戴布拉图、蜘蛛网图(Spider Chart),是财务分析报表的一种。即将一个公司的各项财务分析所得的数字或比率,就其比较重要的项目集中划在一个圆形的图表上,来表现一个公司各项财务比率的情况,使用者能一目了然的了解公司各项财务指标的变动情形及其好坏趋向。
如果你想找到了解H5中怎么制作,可以看一下HTML5 Canvas制作雷达图实战,我也是参考这篇文章,做了小程序的雷达图,并做了一点延伸...
先来看看效果图
开始上菜:
//.wxml ,接下来的操作将在这个Canvas上面绘制 <view class='radarContainer'> <canvas class='radarCanvas' canvas-id='radarCanvas'></canvas> </view>
//.wxss .radarContainer{ background-color: black; width:100%; height:420px; display: flex; justify-content:center; align-items: center; position: relative; } .radarCanvas{ width:400px; height:400px; margin: 0 auto; position: absolute; }
//.js 初始化数据:(我没写在data中) var numCount = 6; //元素个数 var numSlot = 5; //一条线上的总节点数 var mW = 400; //Canvas的宽度 var mCenter = mW / 2; //中心点 var mAngle = Math.PI * 2 / numCount; //角度 var mRadius = mCenter - 60; //半径(减去的值用于给绘制的文本留空间) //获取指定的Canvas var radCtx = wx.createCanvasContext("radarCanvas")
//.js 模拟对战两方的数据 data: { chanelArray1:[["战绩",88],["生存",30],["团战",66],["发育",90],["输出",95],["推进",88]], chanelArray2: [["战绩", 24], ["生存", 60], ["团战", 88], ["发育", 49], ["输出", 46], ["推进", 92]] },
基础数据准备完成,开始画图
// 第一步:绘制6条边 drawEdge: function(){ radCtx.setStrokeStyle("white") radCtx.setLineWidth(2) //设置线宽 for (var i = 0; i < numSlot; i++) { //计算半径 radCtx.beginPath() var rdius = mRadius / numSlot * (i + 1) //画6条线段 for (var j = 0; j < numCount; j++) { //坐标 var x = mCenter + rdius * Math.cos(mAngle * j); var y = mCenter + rdius * Math.sin(mAngle * j); radCtx.lineTo(x, y); } radCtx.closePath() radCtx.stroke() } },
// 第二步:绘制连接点 drawLinePoint:function(){ radCtx.beginPath(); for (var k = 0; k < numCount; k++) { var x = mCenter + mRadius * Math.cos(mAngle * k); var y = mCenter + mRadius * Math.sin(mAngle * k); radCtx.moveTo(mCenter, mCenter); radCtx.lineTo(x, y); } radCtx.stroke(); },
//第三步:绘制文字(文字位置可能需要微调) drawTextCans: function (mData){ radCtx.setFillStyle("white") radCtx.font = 'bold 17px cursive' //设置字体 for (var n = 0; n < numCount; n++) { var x = mCenter + mRadius * Math.cos(mAngle * n); var y = mCenter + mRadius * Math.sin(mAngle * n); // radCtx.fillText(mData[n][0], x, y); //通过不同的位置,调整文本的显示位置 if (mAngle * n >= 0 && mAngle * n <= Math.PI / 2) { radCtx.fillText(mData[n][0], x+5, y+5); } else if (mAngle * n > Math.PI / 2 && mAngle * n <= Math.PI) { radCtx.fillText(mData[n][0], x - radCtx.measureText(mData[n][0]).width-7, y+5); } else if (mAngle * n > Math.PI && mAngle * n <= Math.PI * 3 / 2) { radCtx.fillText(mData[n][0], x - radCtx.measureText(mData[n][0]).width-5, y); } else { radCtx.fillText(mData[n][0], x+7, y+2); } } },
//绘制红色数据区域(数据和填充颜色) drawRegion: function (mData,color){ radCtx.beginPath(); for (var m = 0; m < numCount; m++){ var x = mCenter + mRadius * Math.cos(mAngle * m) * mData[m][1] / 100; var y = mCenter + mRadius * Math.sin(mAngle * m) * mData[m][1] / 100; radCtx.lineTo(x, y); } radCtx.closePath(); radCtx.setFillStyle(color) radCtx.fill(); },
//画点 drawCircle: function(mData,color){ var r = 3; //设置节点小圆点的半径 for(var i = 0; i<numCount; i ++){ var x = mCenter + mRadius * Math.cos(mAngle * i) * mData[i][1] / 100; var y = mCenter + mRadius * Math.sin(mAngle * i) * mData[i][1] / 100; radCtx.beginPath(); radCtx.arc(x, y, r, 0, Math.PI * 2); radCtx.fillStyle = color; radCtx.fill(); } }
重复四五步的方法添加另一方的雷达图
.js文件完整内容如下 var numCount = 6; var numSlot = 5; var mW = 400; var mH = 400; var mCenter = mW / 2; //中心点 var mAngle = Math.PI * 2 / numCount; //角度 var mRadius = mCenter - 60; //半径(减去的值用于给绘制的文本留空间) //获取Canvas var radCtx = wx.createCanvasContext("radarCanvas") Page({ /** * 页面的初始数据 */ data: { stepText:5, chanelArray1:[["战绩",88],["生存",30],["团战",66],["发育",90],["输出",95],["推进",88]], chanelArray2: [["战绩", 24], ["生存", 60], ["团战", 88], ["发育", 49], ["输出", 46], ["推进", 92]] }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { //雷达图 this.drawRadar() }, // 雷达图 drawRadar:function(){ var sourceData1 = this.data.chanelArray1 var sourceData2 = this.data.chanelArray2 //调用 this.drawEdge() this.drawLinePoint() //设置数据 this.drawRegion(sourceData1,'rgba(255, 0, 0, 0.5)') //第一个人的 this.drawRegion(sourceData2, 'rgba(255, 200, 0, 0.5)') //第二个人 //设置文本数据 this.drawTextCans(sourceData1) //设置节点 this.drawCircle(sourceData1,'red') this.drawCircle(sourceData2,'yellow') //开始绘制 radCtx.draw() }, // 绘制6条边 drawEdge: function(){ radCtx.setStrokeStyle("white") radCtx.setLineWidth(2) //设置线宽 for (var i = 0; i < numSlot; i++) { //计算半径 radCtx.beginPath() var rdius = mRadius / numSlot * (i + 1) //画6条线段 for (var j = 0; j < numCount; j++) { //坐标 var x = mCenter + rdius * Math.cos(mAngle * j); var y = mCenter + rdius * Math.sin(mAngle * j); radCtx.lineTo(x, y); } radCtx.closePath() radCtx.stroke() } }, // 绘制连接点 drawLinePoint:function(){ radCtx.beginPath(); for (var k = 0; k < numCount; k++) { var x = mCenter + mRadius * Math.cos(mAngle * k); var y = mCenter + mRadius * Math.sin(mAngle * k); radCtx.moveTo(mCenter, mCenter); radCtx.lineTo(x, y); } radCtx.stroke(); }, //绘制数据区域(数据和填充颜色) drawRegion: function (mData,color){ radCtx.beginPath(); for (var m = 0; m < numCount; m++){ var x = mCenter + mRadius * Math.cos(mAngle * m) * mData[m][1] / 100; var y = mCenter + mRadius * Math.sin(mAngle * m) * mData[m][1] / 100; radCtx.lineTo(x, y); } radCtx.closePath(); radCtx.setFillStyle(color) radCtx.fill(); }, //绘制文字 drawTextCans: function (mData){ radCtx.setFillStyle("white") radCtx.font = 'bold 17px cursive' //设置字体 for (var n = 0; n < numCount; n++) { var x = mCenter + mRadius * Math.cos(mAngle * n); var y = mCenter + mRadius * Math.sin(mAngle * n); // radCtx.fillText(mData[n][0], x, y); //通过不同的位置,调整文本的显示位置 if (mAngle * n >= 0 && mAngle * n <= Math.PI / 2) { radCtx.fillText(mData[n][0], x+5, y+5); } else if (mAngle * n > Math.PI / 2 && mAngle * n <= Math.PI) { radCtx.fillText(mData[n][0], x - radCtx.measureText(mData[n][0]).width-7, y+5); } else if (mAngle * n > Math.PI && mAngle * n <= Math.PI * 3 / 2) { radCtx.fillText(mData[n][0], x - radCtx.measureText(mData[n][0]).width-5, y); } else { radCtx.fillText(mData[n][0], x+7, y+2); } } }, //画点 drawCircle: function(mData,color){ var r = 3; //设置节点小圆点的半径 for(var i = 0; i<numCount; i ++){ var x = mCenter + mRadius * Math.cos(mAngle * i) * mData[i][1] / 100; var y = mCenter + mRadius * Math.sin(mAngle * i) * mData[i][1] / 100; radCtx.beginPath(); radCtx.arc(x, y, r, 0, Math.PI * 2); radCtx.fillStyle = color; radCtx.fill(); } } })
线上+线下+进销存+收银+会员门店零售管理好帮手
门店能实现快速收银,提升门店经营效率。
系统自带进销存管理,更好管理库存销售。
配备收银硬件一站式整体服务。
收 银 会员管理 库存管理 商品管理 交接班 数据报表 营销促单 售后处理 多种收款
获取报价1、本网站发布的该篇文章,目的在于分享电商知识及传递、交流相关电商信息,以便您学习或了解电商知识,请您不要用于其他用途;
2、该篇文章中所涉及的商标、标识的商品/服务并非来源于本网站,更非本网站提供,与本网站无关,系他人的商品或服务,本网站对于该类商标、标识不拥有任何权利;
3、本网站不对该篇文章中所涉及的商标、标识的商品/服务作任何明示或暗示的保证或担保;
4、本网站不对文章中所涉及的内容真实性、准确性、可靠性负责,仅系客观性描述,如您需要了解该类商品/服务详细的资讯,请您直接与该类商品/服务的提供者联系。
推荐文章
最新消息总结,开发一个小程序我们可以选择的第三方框架有5种,大家比较熟悉的有美团小程序框架mpvue,还有组件化框架等...
最近在调研小程序的分享能力,本篇文档主要是调研小程序关于分享方面的玩法,目的是学习小程序在项目应用以及玩法链上...
许多人在使用小程序,会有一个很麻烦的事情,就是使用过小程序之后,会不断的发送自己的定位消息,那么这个小程序的...
一款小程序,很多时候需要调用内置的照相机,实现拍照并图片上传,那么要如何实现呢?...
积分商城平台搭建全解析 在数字化营销的浪潮中,积分商城平台已成为众多企业提升用户粘性、促进消费转化的重要工具。...
公众号积分商城搭建百科 在数字化营销蓬勃发展的当下,公众号积分商城已成为企业和品牌提升用户活跃度、增强用户粘性...
积分商城搭建流程全解析 在数字化营销浪潮中,积分商城已成为众多企业提升用户粘性、促进消费转化的得力工具。搭建一...
积分商城搭建需要多少钱 在当今数字化商业环境中,积分商城作为一种有效的用户激励和营销工具,越来越受到企业的青睐...
积分商城小程序百科 积分商城小程序是一种基于移动互联网平台的应用程序,它依托于微信、支付宝等大型平台,为商家和...
积分商城搭建步骤百科 积分商城作为一种激励用户消费和提高用户粘性的工具,在企业营销策略中占据重要地位。它通过积...