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 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
jquery 分页控件实现代码
Nov 30 Javascript
jQuery与其它库冲突的解决方法
Jun 25 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
Dec 20 Javascript
javascript实现日期格式转换
Dec 16 Javascript
js简单抽奖代码
Jan 16 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
javascript定义类和类的实现实例详解
Dec 01 Javascript
表格展示利器 Bootstrap Table实例代码
Sep 06 Javascript
基于bootstrop常用类总结(推荐)
Sep 11 Javascript
微信小程序入口场景的问题集合与相关解决方法
Jun 26 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 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提取中文首字母
2008/04/09 PHP
跟我学Laravel之路由
2014/10/15 PHP
php实现word转html的方法
2016/01/22 PHP
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
ExtJS的拖拽效果示例
2013/12/09 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
Python的Django框架使用入门指引
2015/04/15 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python中open函数的基本用法示例
2019/09/07 Python
详解Python3中的 input() 函数
2020/03/18 Python
Python turtle库的画笔控制说明
2020/06/28 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
python map比for循环快在哪
2020/09/21 Python
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
怎样写好自荐信和推荐信
2013/12/26 职场文书
英文留学推荐信范文
2014/01/25 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
教师节联欢会主持词
2015/07/04 职场文书
2016年寒假生活小结
2015/10/10 职场文书
公证书
2019/04/17 职场文书
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript
Python采集股票数据并制作可视化柱状图
2022/04/04 Python
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python