您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關微信小程序如何實現雷達圖的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
雷達圖(Radar Chart),又可稱為戴布拉圖、蜘蛛網圖(Spider Chart),是財務分析報表的一種。即將一個公司的各項財務分析所得的數字或比率,就其比較重要的項目集中劃在一個圓形的圖表上,來表現一個公司各項財務比率的情況,使用者能一目了然的了解公司各項財務指標的變動情形及其好壞趨向。
先來看看效果圖
開始上菜:
//.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(); } } })
感謝各位的閱讀!關于“微信小程序如何實現雷達圖”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。