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 相关文章推荐
AngularJS入门教程(一):静态模板
Dec 06 Javascript
js解决movebox移动问题
Mar 29 Javascript
修改js confirm alert 提示框文字的简单实例
Jun 10 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
canvas实现绘制吃豆鱼效果
Jan 12 Javascript
JS控制鼠标拒绝点击某一按钮的实例
Dec 29 Javascript
vue初始化动画加载的实例
Sep 01 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
小程序关于请求同步的总结
May 05 Javascript
vue滚动固定顶部及修改样式的实例代码
May 30 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
Sep 26 Javascript
javascript中的with语句学习笔记及用法
Feb 17 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生成zip文件类实例
2015/04/07 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
2017/01/18 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
150行Node.js实现的dns代理工具
2019/08/02 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
python计数排序和基数排序算法实例
2014/04/25 Python
python的绘图工具matplotlib使用实例
2014/07/03 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
数控专业毕业生求职信范文
2013/09/21 职场文书
大学生关于奋斗的演讲稿
2014/01/09 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript