雪月圣雕 发表于 2021-4-14 09:25:52

运用canvas标签建立饼状图

本帖最后由 雪月圣雕 于 2021-4-14 09:27 编辑

两个数据对应两个饼状图
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <canvas id="RectCanvas" width="1111" height="999">不支持!!!</canvas>
    <script type="text/javascript">
    //下面的注释使得canvas代码可以自动补全
      /** @type {HTMLCanvasElement} */
      var canvas = document.getElementById("RectCanvas");//创建并加载testCanvas
      var context = canvas.getContext("2d");//getContext方法的参数为2d,表示创建了一个二维环境。

      //绘制扇区
      /*
      context.beginPath();
      //连接圆心
      context.moveTo(200,200);
      //弧度与角度的转换公式:弧度 = 角度 * PI / 180。
      context.arc(200,200,100,0,30 * Math.PI / 180, false);
      context.closePath();
      //画笔结束时回到圆心。这四行代码的顺序不能换
      context.stroke();
      */

      var data = [
            {
                "value": .2,
                "color": "red",
                "title": "应届生"
            },
            {
                "value": .3,
                "color": "blue",
                "title": "社会招生"
            },
            {
                "value": .4,
                "color": "green",
                "title": "老学员推荐"
            },
            {
                "value": .1,
                "color": "#ccc",
                "title": "公开课"
            },
      ];

      var risk_data = [
            {
                "name": "滑坡风险1",
                "color": "red",
                "RiskTypeId":1
            },
            {
                "name": "滑坡治理施工作业1",
                "color": "#FF8C00",
                "RiskTypeId":2
            },
            {
                "name": "阀室放空管喷砂除锈作业1",
                "color": "yellow",
                "RiskTypeId":3
            },
            {
                "name": "阀室放空管喷砂除锈作业2",
                "color": "yellow",
                "RiskTypeId":3
            },
      ]

      //绘制风险饼状图
      var Risk_x0 = 200;
      var Risk_y0 = 200;
      var Risk_radius = 100;
      var Risk_tempAngle = -90;
      var Risk_type = new Array(3);
      Risk_type = 0;
      Risk_type = 0;
      Risk_type = 0;

      //计算各风险类型的个数,再求占比
      for(var i = 0; i < risk_data.length; i++)
      {
            if(risk_data.RiskTypeId == 1)
                Risk_type++;
            if(risk_data.RiskTypeId == 2)
                Risk_type++;
            if(risk_data.RiskTypeId == 3)
                Risk_type++;
      }

      //Risk_type1 = Risk_type1 / risk_data.length;
      //Risk_type2 = Risk_type2 / risk_data.length;
      //Risk_type3 = Risk_type3 / risk_data.length;

      //开始绘制风险饼状图
      for(var i = 0; i < Risk_type.length; i++)
      {
            context.beginPath();
            context.moveTo(Risk_x0,Risk_y0);
            var angle = (Risk_type / risk_data.length) * 360;
            if(i == 0)
            {
                context.fillStyle = "red";
            }
            else if(i == 1)
            {
                context.fillStyle = "#FF8C00";
            }
            else if(i == 2)
            {
                context.fillStyle = "yellow";
            }
            var startAngle = Risk_tempAngle * Math.PI / 180;
            var endAngle = (Risk_tempAngle + angle) * Math.PI / 180;
            context.arc(Risk_x0, Risk_y0, Risk_radius, startAngle, endAngle, false);
            //context.closePath();
            //context.fill();
            //Risk_tempAngle += angle;
            
            //context.stroke(); //描边

            //绘制文字。
            var Riskvalue = Risk_type / risk_data.length;
            var temp = Riskvalue.toFixed(2);    //保留两位小数
            var txt = temp * 100 + "%";
            var width = 30, height = 10; //图例宽和高
            var posX = Risk_x0 + 130;
            var posY = 100;
            var textX = posX + width + 5, textY = posY + 10;

            context.fillRect(posX,posY+20*i,width,height);
            context.moveTo(posX,posY+20*i);
            context.font = 'bold 12px';
            context.fillText(txt,textX,textY+20*i);


            context.closePath();
            context.fill();
            Risk_tempAngle += angle;
      }
      context.textAlign = "center";
      context.fillStyle = "red";
      context.font = 'bold 12px 微软雅黑';
      context.fillText("风险类型占比",200,320);

      
      var x0 = 200;
      var y0 = 200;
      var radius = 100;
      //从Y轴的正半轴开始顺时针绘图,系统默认为-90°
      var tempAngle = -90;
      //绘制饼状图
      
      /*for(var i = 0; i < data.length; i++)
      {
            context.beginPath();
            context.moveTo(x0,y0);
            var angle = data.value * 360;    //值*360 = 角度
            context.fillStyle = data.color;
            var startAngle = tempAngle * Math.PI / 180;
            var endAngle = (tempAngle + angle) * Math.PI / 180;      //顺时针绘图
            //false:顺时针,true:逆时针。
            context.arc(x0,y0,radius,startAngle,endAngle,false);

            //绘制文字
            var txt = data.value * 100 + '%';
            var x,y;
            var txtAngle = tempAngle + 1/2 * angle;
            //公式:x = 圆心x + Math.cos(扇区的中心角度的弧度) * (R + 20)————不一定是20.(R + 20)是斜边。y坐标同理
            x = x0 + Math.cos(txtAngle * Math.PI / 180) * (radius + 20);
            y = y0 + Math.sin(txtAngle * Math.PI / 180) * (radius + 20);

            //如果要添加的文字出现在y轴的左边,设置对齐方式为末端靠近y轴。
            if(txtAngle > 90 && txtAngle < 270)
            {
                //textAlign的对齐方式是关于(x0,y0)(即绘制的初始起点)所在的Y轴进行对齐的。
                //还有一个textBaseline 则是关于X轴(即底线)对齐
                context.textAlign = "end";
            }
            context.fillText(txt,x,y);

            context.fill();
            tempAngle += angle; //下一次绘制的起始角度
            context.closePath();
            //画笔结束时回到圆心。这四行代码的顺序不能换
            context.stroke();
            
      }*/
      


    </script>
</body>
</html>
javascript:;
页: [1]
查看完整版本: 运用canvas标签建立饼状图