JS+canvas动态绘制饼图的方法示例


Posted in Javascript onSeptember 12, 2017

本文实例讲述了JS+canvas动态绘饼图的方法。分享给大家供大家参考,具体如下:

运行效果图如下:

JS+canvas动态绘制饼图的方法示例

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>3water.com canvas饼状图</title>
</head>
<body>
<canvas id="canvas" width="800" height="600" style="border:1px solid red"></canvas>
</body>
<script>
  var colors = (function () {
    return ( "aliceblue,antiquewhite,aqua,aquamarine,azure,beige,bisque,black,blanchedalmond,blue," +
    "blueviolet,brown,burlywood,cadetblue,chartreuse,chocolate,coral,cornflowerblue,cornsilk," +
    "crimson,cyan,darkblue,darkcyan,darkgoldenrod,darkgray,darkgreen,darkgrey,darkkhaki,darkmagenta," +
    "darkolivegreen,darkorange,darkorchid,darkred,darksalmon,darkseagreen,darkslateblue,darkslategray," +
    "darkslategrey,darkturquoise,darkviolet,deeppink,deepskyblue,dimgray,dimgrey,dodgerblue,firebrick," +
    "floralwhite,forestgreen,fuchsia,gainsboro,ghostwhite,gold,goldenrod,gray,green,greenyellow,grey," +
    "honeydew,hotpink,indianred,indigo,ivory,khaki,lavender,lavenderblush,lawngreen,lemonchiffon," +
    "lightblue,lightcoral,lightcyan,lightgoldenrodyellow,lightgray,lightgreen,lightgrey,lightpink," +
    "lightsalmon,lightseagreen,lightskyblue,lightslategray,lightslategrey,lightsteelblue,lightyellow," +
    "lime,limegreen,linen,magenta,maroon,mediumaquamarine,mediumblue,mediumorchid,mediumpurple," +
    "mediumseagreen,mediumslateblue,mediumspringgreen,mediumturquoise,mediumvioletred,midnightblue," +
    "mintcream,mistyrose,moccasin,navajowhite,navy,oldlace,olive,olivedrab,orange,orangered,orchid," +
    "palegoldenrod,palegreen,paleturquoise,palevioletred,papayawhip,peachpuff,peru,pink,plum,powderblue," +
    "purple,rebeccapurple,red,rosybrown,royalblue,saddlebrown,salmon,sandybrown,seagreen,seashell,sienna," +
    "silver,skyblue,slateblue,slategray,slategrey,snow,springgreen,steelblue,tan,teal,thistle,transparent," +
    "tomato,turquoise,violet,wheat,white,whitesmoke,yellow,yellowgreen" ).split(',');
  })();
  function Bing(obj) {
    this.start = 0;
    for(var key in obj){
      this[key] = obj[key];
    }
    this.init();
  }
  Bing.prototype = {
    init: function () {
      this.handle();
      this.render(this.data2);
      this.drawText();
    },
    /**
     * 渲染页面
     * @param obj
     * @param i
     */
    render: function (obj) {
      //3、计算每一个扇形的起始弧度和结束弧度
      this.data2.forEach(function (v, i) {
        var obj = {};
        //第一个扇形的起始弧度:start 结束:start+第一个扇形占据的弧度差
        obj.start = this.start;
        obj.end = this.start + v.radian;
        this.start += v.radian;
        //绘制扇形
        this.ctx.beginPath();
        this.ctx.moveTo(300, 300);
        this.ctx.arc(300, 300, 150, obj.start, obj.end);
        this.ctx.fillStyle = colors[i * 15];
        this.ctx.fill();
      }, this);
    },
    /**
     * 处理数据
     */
    handle:function(){
      var sum = 0;
      this.data.forEach(function (v) {
        sum += v;
      });
      //2、计算每一个数据所占的比重
      this.data2 = this.data.map(function (v) {
        var obj = {};
        obj.number = v;
        obj.ratio = v / sum;//每个数据占据的比重
        obj.radian = 2 * Math.PI * v / sum;//该扇形所占据的弧度
        obj.start = this.start;
        obj.end = this.start + obj.radian;
        this.start = obj.end;
        return obj;
      },this);
    },
    drawText:function(){
      this.ctx.font = "30px 微软雅黑";
      this.ctx.fillStyle = 'red';
      this.data2.forEach(function(obj){
        //计算文字所在的弧度
        r2 = obj.start + obj.radian/2;
        //就按相对于圆心文字偏移的位置
        b = this.r*Math.cos(r2);
        h = this.r*Math.sin(r2);
        //文字的位置
        var x2 = this.x + b;
        var y2 = this.y + h;
        this.ctx.fillText(obj.number,x2,y2);
      },this);
    }
  };
  var canvas = document.querySelector('canvas');
  var ctx = canvas.getContext('2d');
  var data = [1, 3, 5, 7, 9];
  var bing = new Bing({
    ctx:ctx,
    x:300,
    y:300,
    r:150,
    data:data
  });
</script>
</html>

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
May 13 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
Mar 18 Javascript
基于jQuery实现下拉框
Nov 24 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
Oct 25 Javascript
angular-ui-sortable实现可拖拽排序列表
Dec 28 Javascript
jQuery导航条固定定位效果实例代码
May 26 jQuery
angular.js中解决跨域问题的三种方式
Jul 12 Javascript
解决vue单页路由跳转后scrollTop的问题
Sep 03 Javascript
发布Angular应用至生产环境的方法
Dec 10 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
Aug 14 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 Javascript
详解react-router4 异步加载路由两种方法
Sep 12 #Javascript
JS+canvas绘制的动态机械表动画效果
Sep 12 #Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 #Javascript
Angular 4.0学习教程之架构详解
Sep 12 #Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 #jQuery
详解vue axios中文文档
Sep 12 #Javascript
javascript算法之二叉搜索树的示例代码
Sep 12 #Javascript
You might like
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
javascript控制台详解
2015/06/25 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python中itertools的用法详解
2020/02/07 Python
python设置环境变量的作用整理
2020/02/17 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
英国儿童图书网站:Scholastic
2017/03/26 全球购物
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
电力公司个人求职信范文
2014/02/04 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
安全标兵事迹材料
2014/08/17 职场文书
班子四风对照检查材料
2014/08/21 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
爱国主义电影观后感
2015/06/18 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers