canvas——饼状图绘制文字

重点:计算文字应放的位置坐标。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>饼状图绘制文字</title>
</head>
<body>
<div id="container">
    <canvas id="cavsElem">
        您的浏览器不支持canvas,请升级浏览器
    </canvas>
</div>
<script>
    (function(){
        var canvas = document.getElementById('cavsElem');
        var ctx = canvas.getContext('2d');
        canvas.width = 600;
        canvas.height = 600;
        canvas.style.border = '1px solid red';

        var data = [{
            "value": .2,
            "color": "red",
            "title": "大专"
        },{
            "value": .4,
            "color": "blue",
            "title": "本科"
        },{
            "value": .3,
            "color": "green",
            "title": "硕士"
        },{
            "value": .1,
            "color": "orange",
            "title": "博士"
        }];

        //定义起始角度
        var tempAngle=-90;
        //定圆心位置
        var x0=300,y0=300;
        //定半径长度
        var radius=200;
        //从-90度开始绘制
        for(var i=0; i<data.length; i++){
            ctx.beginPath();
            ctx.moveTo(x0,y0);
            //当前扇形角度
            var angle = data[i].value*360;
            //当前扇形起始绘制弧度
            var startAngle = tempAngle*Math.PI/180;
            //当前扇形借结束绘制弧度
            var endAngle = (tempAngle + angle)*Math.PI/180;
            //绘制扇形
            ctx.arc(x0,y0,radius,startAngle,endAngle);
            ctx.stroke();
            //填充扇形
            ctx.fillStyle = data[i].color;
            ctx.fill();

            //绘制文字
            //提取要绘制的文字内容
            var txt = data[i].value*100+'%';
            //计算文字要放的角度
            var txtAngle = tempAngle + 1/2*angle;
            //计算文字要放的坐标位置
            var x,y;
            x=x0+Math.cos(txtAngle*Math.PI/180)*(radius+20);
            y=y0+Math.sin(txtAngle*Math.PI/180)*(radius+20);
            //如果文字在圆形的左侧,那么让文字 对齐方式为 文字结尾对齐当前坐标。
            if(txtAngle>90 && txtAngle<270){
                ctx.textAlign = 'end';
            }
            //文字绘制到扇形旁边
            ctx.fillText(txt,x,y);

            //当前扇形结束绘制角度,即下一个扇形开始绘制角度
            tempAngle += angle;
        }
    })();
</script>
</body>
</html>

效果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值