zoukankan      html  css  js  c++  java
  • 饼状图

    效果图:

    html:

    <canvas id="canvas" width="500" height="500"></canvas>

    js:

    var data = [
      { name: '第一期', num: 500, color: '#ff9273' },
      { name: '第二期', num: 300, color: '#2ed6b9' },
      { name: '第三期', num: 900, color: '#3ba2f2' },
      { name: '第四期', num: 700, color: '#ffcc4d' },
      { name: '第五期', num: 300, color: '#2ed6b9' },
      { name: '第六期', num: 700, color: '#ffcc4d' },
    ];
    chart(data, 'canvas');

    function chart(a,b){
      var canvas = document.getElementById(b);
      var ctx = canvas.getContext('2d');
      var deg = Math.PI / 180;
      var end_deg = 0;
      var star_deg = -90;
      var total = 0;
      var width = canvas.width;
      var height = canvas.height;
      
      for(var i = 0; i < a.length; i++) {
        total += a[i].num - 0;
      }
      function getX(n, r) {
        return r * Math.sin(n * ((2 * Math.PI) / 360));
      }

      function getY(n, r) {
        return r * Math.cos(n * ((2 * Math.PI) / 360));
      }

      for(var i = 0; i < a.length; i++) {
        end_deg = (a[i].num - 0) / total * 360;

        ctx.beginPath();
        ctx.moveTo(width / 2, height / 2);
        ctx.arc(width / 2, height / 2, height * 0.3, star_deg * deg, (star_deg + end_deg) * deg, false);
        ctx.fillStyle = a[i].color;
        ctx.fill();

        ctx.beginPath()
        var x0 = width / 2 + getY(star_deg + end_deg / 2, height * 0.3);
        var y0 = height / 2 + getX(star_deg + end_deg / 2, height * 0.3);
        var x1 = width / 2 + getY(star_deg + end_deg / 2, height * 0.3 + 20);
        var y1 = height / 2 + getX(star_deg + end_deg / 2, height * 0.3 + 20);
        ctx.moveTo(x0, y0);
        ctx.lineTo(x1, y1)
        ctx.strokeStyle = a[i].color
        ctx.stroke()

        ctx.beginPath()
        if(x0 > x1) {
          ctx.textAlign = 'left'
          var x2 = x0 - ctx.measureText(data[i].name).width - 30
        } else {
          ctx.textAlign = 'right'
          var x2 = x0 + ctx.measureText(data[i].name).width + 30
        }
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y1);
        ctx.font="20px Arial";
        ctx.fillText(a[i].name, x2, y1 - 4)
        ctx.strokeStyle = a[i].color;
        ctx.stroke();

        star_deg += end_deg;
      }
    };

    你好!如果你有什么更好的建议或意见,请在评论区留言。感谢你的阅读!
  • 相关阅读:
    多条件复合搜索的实现
    mysql字符集统一
    JS控制彈出窗口
    mysql常用sql
    正则表达式
    航班时间
    1月19日
    1月28日check小爱用
    在么小猫
    大连美发备考
  • 原文地址:https://www.cnblogs.com/YCxiaoyang/p/9252782.html
Copyright © 2011-2022 走看看