玫瑰仪表盘

写成简单插件的代码github地址:https://github.com/Onewwway/web-roseChart (插件写得不是很熟练,请多多指教)

 

简单版:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body style="background-color: #000;">
    <canvas id="canvas" width="1200" height="500"></canvas >

    <script>
        var canvas = document.getElementById('canvas');
        let semicircle = canvas.getContext('2d');
        let data = [{
            name: '鄂',
            percent: 50.2
        },{
            name: '粤',
            percent: 16.6
        },{
            name: '川',
            percent: 10.4
        },{
            name: '京',
            percent: 9.9
        },{
            name: '苏',
            percent: 8.2
        },{
            name: '其他',
            percent: 3.2
        }]
        let start = Math.PI, end = Math.PI;
        // 位移到圆心,方便绘制
        semicircle.translate(600, 300);
        function setChart(){
            for(let i = 0; i < data.length; i++){
                end +=  Math.PI / data.length; // 终止角度

                let limit = 15 - Math.round(data[i].percent / 100 * 15);

                for(let j = 1; j <= 15; j++){
                    if(j > limit){
                        // 开始一条新路径
                        semicircle.beginPath();
                        // 移动到圆心
                        semicircle.moveTo(0, 0);
                        semicircle.fillStyle = "#303030";
                        semicircle.strokeStyle = "#000";
                        semicircle.lineWidth = 2;
                        semicircle.arc(0, 0, 200 - j * 12, start, end);
                        // 闭合路径
                        semicircle.fill();
                        semicircle.closePath();
                        semicircle.stroke();
                    }else if(j == limit){
                        // 开始一条新路径
                        semicircle.beginPath();
                        // 移动到圆心
                        semicircle.moveTo(0, 0);
                        semicircle.fillStyle = "#26E2E3";
                        semicircle.strokeStyle = "#000";
                        semicircle.lineWidth = 2;
                        semicircle.arc(0, 0, 200 - j * 12, start, end);
                        // 闭合路径
                        semicircle.fill();
                        semicircle.closePath();
                        semicircle.stroke();
                    }else{
                        // 开始一条新路径
                        semicircle.beginPath();
                        // 移动到圆心
                        semicircle.moveTo(0, 0);
                        semicircle.fillStyle = "#141414";
                        semicircle.strokeStyle = "#000";
                        semicircle.lineWidth = 2;
                        semicircle.arc(0, 0, 200 - j * 12, start, end);
                        // 闭合路径
                        semicircle.fill();
                        semicircle.closePath();
                        semicircle.stroke();
                    }
                }

                start =  end; // 起始角度
            }
        }
        function setWords(){
            let angle;
            for(let i = 0; i < data.length; i++){
                if(i == 0){
                    angle = Math.PI + Math.PI / data.length / 2;
                }else{
                    angle = Math.PI + Math.PI / data.length / 2 + Math.PI / data.length * i; // 30°
                }
                semicircle.save();
                semicircle.translate(Math.cos(angle) * 220 - 230, Math.sin(angle) * 220);
                semicircle.font = "14px scans-serif";
                semicircle.fillStyle = "#FFF";
                semicircle.fillText(data[i].name, 210, -6);
                semicircle.font = "14px scans-serif";
                semicircle.fillStyle = "#26E2E3";
                semicircle.fillText(data[i].percent + "%", 210, 14);
                semicircle.restore();
            }
        }
        setChart();
        setWords();
    </script>
</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值