微信小程序实现雷达图的方式,小程序雷达图怎么做



雷达图(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、本网站不对文章中所涉及的内容真实性、准确性、可靠性负责,仅系客观性描述,如您需要了解该类商品/服务详细的资讯,请您直接与该类商品/服务的提供者联系。


KESION 科汛软件

KESION 科汛软件是国内领先的在线教育软件及私域社交电商软件服务提供商,长期专注于为企业提供在线教育软件及社交电商SaaS平台解决方案。
公司核心产品云开店SaaS社交电商服务平台、在线教育SaaS服务平台、教育企业数字化SaaS云平台、企微营销助手、私有化独立部署品牌网校和在线教育咨询等。

KESION 不断通过技术创新,提供产品和服务,助力企业向数字化转型,通过科技驱动商业革新,让商业变得更智慧!



▼点击进入科汛官网了解更多



热门标签
微信小程序 SaaS
上/下篇
  • 小程序监控接口开发文档

  • 使用mpvue开发微信小程序

换一换相关推荐
精选内容
热点精选