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 相关文章推荐
ASP中用Join和Array,可以加快字符连接速度的代码
Aug 22 Javascript
jQuery实现可拖动的浮动层完整代码
May 27 Javascript
Jquery实现自定义窗口随意的拖拽
Mar 12 Javascript
javascript框架设计之框架分类及主要功能
Jun 23 Javascript
AngularJS中处理多个promise的方式
Feb 02 Javascript
jquery中键盘事件小结
Feb 24 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
vue.js开发环境搭建教程
May 04 Javascript
vue.js仿hover效果的实现方法示例
Jan 28 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
Nov 21 Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 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中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
React中的render何时执行过程
2018/04/13 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
Python深入学习之装饰器
2014/08/31 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python 多线程实例详解
2017/03/25 Python
python实现分页效果
2017/10/25 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
更新修改后的Python模块方法
2019/03/03 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
python视频按帧截取图片工具
2019/07/23 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
优秀员工自荐书
2013/12/19 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书