鱼C论坛

 找回密码
 立即注册
查看: 4024|回复: 0

[学习笔记] 运用canvas标签建立饼状图

[复制链接]
发表于 2021-4-14 09:25:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

  27.         var data = [
  28.             {
  29.                 "value": .2,
  30.                 "color": "red",
  31.                 "title": "应届生"
  32.             },
  33.             {
  34.                 "value": .3,
  35.                 "color": "blue",
  36.                 "title": "社会招生"
  37.             },
  38.             {
  39.                 "value": .4,
  40.                 "color": "green",
  41.                 "title": "老学员推荐"
  42.             },
  43.             {
  44.                 "value": .1,
  45.                 "color": "#ccc",
  46.                 "title": "公开课"
  47.             },
  48.         ];

  49.         var risk_data = [
  50.             {
  51.                 "name": "滑坡风险1",
  52.                 "color": "red",
  53.                 "RiskTypeId":1
  54.             },
  55.             {
  56.                 "name": "滑坡治理施工作业1",
  57.                 "color": "#FF8C00",
  58.                 "RiskTypeId":2
  59.             },
  60.             {
  61.                 "name": "阀室放空管喷砂除锈作业1",
  62.                 "color": "yellow",
  63.                 "RiskTypeId":3
  64.             },
  65.             {
  66.                 "name": "阀室放空管喷砂除锈作业2",
  67.                 "color": "yellow",
  68.                 "RiskTypeId":3
  69.             },
  70.         ]

  71.         //绘制风险饼状图
  72.         var Risk_x0 = 200;
  73.         var Risk_y0 = 200;
  74.         var Risk_radius = 100;
  75.         var Risk_tempAngle = -90;
  76.         var Risk_type = new Array(3);
  77.         Risk_type[0] = 0;
  78.         Risk_type[1] = 0;
  79.         Risk_type[2] = 0;

  80.         //计算各风险类型的个数,再求占比
  81.         for(var i = 0; i < risk_data.length; i++)
  82.         {
  83.             if(risk_data[i].RiskTypeId == 1)
  84.                 Risk_type[0]++;
  85.             if(risk_data[i].RiskTypeId == 2)
  86.                 Risk_type[1]++;
  87.             if(risk_data[i].RiskTypeId == 3)
  88.                 Risk_type[2]++;
  89.         }

  90.         //Risk_type1 = Risk_type1 / risk_data.length;
  91.         //Risk_type2 = Risk_type2 / risk_data.length;
  92.         //Risk_type3 = Risk_type3 / risk_data.length;

  93.         //开始绘制风险饼状图
  94.         for(var i = 0; i < Risk_type.length; i++)
  95.         {
  96.             context.beginPath();
  97.             context.moveTo(Risk_x0,Risk_y0);
  98.             var angle = (Risk_type[i] / risk_data.length) * 360;
  99.             if(i == 0)
  100.             {
  101.                 context.fillStyle = "red";
  102.             }
  103.             else if(i == 1)
  104.             {
  105.                 context.fillStyle = "#FF8C00";
  106.             }
  107.             else if(i == 2)
  108.             {
  109.                 context.fillStyle = "yellow";
  110.             }
  111.             var startAngle = Risk_tempAngle * Math.PI / 180;
  112.             var endAngle = (Risk_tempAngle + angle) * Math.PI / 180;
  113.             context.arc(Risk_x0, Risk_y0, Risk_radius, startAngle, endAngle, false);
  114.             //context.closePath();
  115.             //context.fill();
  116.             //Risk_tempAngle += angle;
  117.             
  118.             //context.stroke(); //描边

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

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


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

  139.         
  140.         var x0 = 200;
  141.         var y0 = 200;
  142.         var radius = 100;
  143.         //从Y轴的正半轴开始顺时针绘图,系统默认为-90°
  144.         var tempAngle = -90;
  145.         //绘制饼状图
  146.         
  147.         /*for(var i = 0; i < data.length; i++)
  148.         {
  149.             context.beginPath();
  150.             context.moveTo(x0,y0);
  151.             var angle = data[i].value * 360;    //值*360 = 角度
  152.             context.fillStyle = data[i].color;
  153.             var startAngle = tempAngle * Math.PI / 180;
  154.             var endAngle = (tempAngle + angle) * Math.PI / 180;        //顺时针绘图
  155.             //false:顺时针,true:逆时针。
  156.             context.arc(x0,y0,radius,startAngle,endAngle,false);

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

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

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


  180.     </script>
  181. </body>
  182. </html>
复制代码

javascript:;
饼状图PNG.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 03:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表