Canvas制作雷達(dá)圖 – JS筆記

    數(shù)據(jù)可視化可以讓大量枯燥的數(shù)據(jù)顯的更加簡(jiǎn)單直觀,而雷達(dá)圖,就是數(shù)據(jù)可視化中你的一種。雷達(dá)圖又叫蜘蛛網(wǎng)圖,是一種對(duì)各項(xiàng)數(shù)據(jù)查看很明顯的表現(xiàn)圖

    數(shù)據(jù)可視化可以讓大量枯燥的數(shù)據(jù)顯的更加簡(jiǎn)單直觀,而雷達(dá)圖,就是數(shù)據(jù)可視化中你的一種。雷達(dá)圖又叫蜘蛛網(wǎng)圖,是一種對(duì)各項(xiàng)數(shù)據(jù)查看很明顯的表現(xiàn)圖,在很多游戲中,對(duì)游戲中的每個(gè)角色的分析圖一般也用這種圖。

    接下來,讓我們用HTML5的Cavas來實(shí)現(xiàn)雷達(dá)圖。

    效果

    Canvas制作雷達(dá)圖 - JS筆記

    一、創(chuàng)建Canvas

    var mW = 400;
    var mH = 400;
    var mCtx = null;
    
    var canvas = document.createElement('canvas');
    document.body.appendChild(canvas);
    canvas.height = mH;
    canvas.width = mW;
    mCtx = canvas.getContext('2d');

    二、制作多邊形背景

    var mCount = 6; //邊數(shù)
    var mCenter = mW /2; //中心點(diǎn)
    var mRadius = mCenter - 50; //半徑(減去的值用于給繪制的文本留空間)
    var mAngle = Math.PI * 2 / mCount; //角度
    var mColorPolygon = '#B8B8B8'; //多邊形顏色
    
    // 繪制多邊形邊
    function drawPolygon(ctx){
        ctx.save();
    
        ctx.strokeStyle = mColorPolygon;
        var r = mRadius/ mCount; //單位半徑
        //畫6個(gè)圈
        for(var i = 0; i < mCount; i ++){
            ctx.beginPath();        
            var currR = r * ( i + 1); //當(dāng)前半徑
            //畫6條邊
            for(var j = 0; j < mCount; j ++){
                var x = mCenter + currR * Math.cos(mAngle * j);
                var y = mCenter + currR * Math.sin(mAngle * j);
    
                ctx.lineTo(x, y);
            }
            ctx.closePath()
            ctx.stroke();
        }
    
        ctx.restore();
    }

    三、連接頂點(diǎn)線

    var mColorLines = '#B8B8B8'; //頂點(diǎn)連線顏色
    
    //頂點(diǎn)連線
    function drawLines(ctx){
        ctx.save();
    
        ctx.beginPath();
        ctx.strokeStyle = mColorLines;
    
        for(var i = 0; i < mCount; i ++){
            var x = mCenter + mRadius * Math.cos(mAngle * i);
            var y = mCenter + mRadius * Math.sin(mAngle * i);
    
            ctx.moveTo(mCenter, mCenter);
            ctx.lineTo(x, y);
        }
    
        ctx.stroke();
    
        ctx.restore();
    }

    四、繪制數(shù)據(jù)文本

    var mData = [['速度', 77],
                ['力量', 72],
                ['防守', 46],
                ['射門', 50],
                ['傳球', 80],
                ['耐力', 60]]; //數(shù)據(jù)
    var mColorText = '#000000';
    
    //繪制文本
    function drawText(ctx){
        ctx.save();
    
        var fontSize = mCenter / 12;
        ctx.font = fontSize + 'px Microsoft Yahei';
        ctx.fillStyle = mColorText;
    
        for(var i = 0; i < mCount; i ++){
            var x = mCenter + mRadius * Math.cos(mAngle * i);
            var y = mCenter + mRadius * Math.sin(mAngle * i);
    
            //通過不同的位置,調(diào)整文本的顯示位置
            if( mAngle * i >= 0 && mAngle * i <= Math.PI / 2 ){
                ctx.fillText(mData[i][0], x, y + fontSize); 
            }else if(mAngle * i > Math.PI / 2 && mAngle * i <= Math.PI){
                ctx.fillText(mData[i][0], x - ctx.measureText(mData[i][0]).width, y + fontSize);    
            }else if(mAngle * i > Math.PI && mAngle * i <= Math.PI * 3 / 2){
                ctx.fillText(mData[i][0], x - ctx.measureText(mData[i][0]).width, y);   
            }else{
                ctx.fillText(mData[i][0], x, y);
            }
    
        }
    
        ctx.restore();
    }

    五、繪制數(shù)據(jù)覆蓋區(qū)域

    //繪制數(shù)據(jù)區(qū)域
    function drawRegion(ctx){
        ctx.save();
    
        ctx.beginPath();
        for(var i = 0; i < mCount; 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;
    
            ctx.lineTo(x, y);
        }
        ctx.closePath();
        ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';
        ctx.fill();
    
        ctx.restore();
    }

    六、繪制數(shù)據(jù)點(diǎn)

    把每個(gè)數(shù)據(jù)與線的焦點(diǎn)繪制出來。

    //畫點(diǎn)
    function drawCircle(ctx){
        ctx.save();
    
        var r = mCenter / 18;
        for(var i = 0; i < mCount; 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;
    
            ctx.beginPath();            
            ctx.arc(x, y, r, 0, Math.PI * 2);
            ctx.fillStyle = 'rgba(255, 0, 0, 0.8)';
            ctx.fill();
        }       
    
        ctx.restore();
    }

    下載權(quán)限
    查看
    • 免費(fèi)下載
      評(píng)論并刷新后下載
      登錄后下載
    • {{attr.name}}:
    您當(dāng)前的等級(jí)為
    登錄后免費(fèi)下載登錄 小黑屋反思中,不準(zhǔn)下載! 評(píng)論后刷新頁面下載評(píng)論 支付以后下載 請(qǐng)先登錄 您今天的下載次數(shù)(次)用完了,請(qǐng)明天再來 支付積分以后下載立即支付 支付以后下載立即支付 您當(dāng)前的用戶組不允許下載升級(jí)會(huì)員
    您已獲得下載權(quán)限 您可以每天下載資源次,今日剩余

    給TA贊賞
    共{{data.count}}人
    人已贊賞
    ??
    Npcink上的部份代碼及教程來源于互聯(lián)網(wǎng),僅供網(wǎng)友學(xué)習(xí)交流,若您喜歡本文可附上原文鏈接隨意轉(zhuǎn)載。
    無意侵害您的權(quán)益,請(qǐng)發(fā)送郵件至 1355471563#qq.com 或點(diǎn)擊右側(cè) 私信:Muze 反饋,我們將盡快處理。
    ?
    購物車
    優(yōu)惠劵
    搜索
    主站蜘蛛池模板: 日本美女一区二区三区| 国产一区中文字幕| 美女免费视频一区二区| 亚洲精品无码一区二区| 亲子乱av一区区三区40岁| 亚洲AV无码国产精品永久一区 | 日韩视频在线一区| 国产一区二区三区在线观看影院| 精品无码成人片一区二区| 国产日韩高清一区二区三区| 日本在线一区二区| 亚洲香蕉久久一区二区| 老熟妇高潮一区二区三区| 国产A∨国片精品一区二区| 精品无码人妻一区二区三区不卡| 久久精品一区二区东京热| 久久er99热精品一区二区| 亚洲一区二区三区无码国产| 国产一区二区三区播放| 精品一区二区三区中文字幕| 亚洲午夜一区二区三区| 在线观看中文字幕一区| 中文字幕一区日韩在线视频| 亚洲AV无码国产一区二区三区| 在线不卡一区二区三区日韩| 久久精品人妻一区二区三区| 91大神在线精品视频一区| 中文字幕日韩欧美一区二区三区| 国产福利电影一区二区三区久久久久成人精品综合 | 亚洲AV成人一区二区三区AV| 国产精品成人免费一区二区| 国产午夜精品一区二区三区不卡 | 国产伦精品一区三区视频| 美女视频在线一区二区三区| 在线精品日韩一区二区三区| 日本午夜精品一区二区三区电影| а天堂中文最新一区二区三区| 成人免费观看一区二区| 国产一区二区精品久久| 无码人妻久久一区二区三区蜜桃 | 日本精品少妇一区二区三区|