html5 canvas简单封装一个echarts实现不了的饼图


Posted in HTML / CSS onJune 12, 2018

说明

我用echars很久了,如果出现如上图所示样式的饼图,我用echarts很难实现,官方给的文档没有这种模式的饼图。试过用d3和canvas分别画饼图,因为本人对canvas比较熟悉和d3还要引入插件,本着轻量化的原则,所以采用canvas封装。

官方饼图两种模式:(1)半径模式(2)面积模式

html5 canvas简单封装一个echarts实现不了的饼图

实现过程

(1)封装的函数如下:

function drawCircle(canvasId, option) {
    const color_arr = option.color
    let data_arr = option.data
    const pi2 = Math.PI * 2;
    let canvas = document.getElementById(canvasId);
    let c = canvas.getContext("2d");
    let startAgl = 0;
    let agl;
    let sum = 0;
    const cW = canvas.width;
    const cH = canvas.height;
    for (let item of data_arr) {
      sum += item.value * 1.0
    }
    data_arr = data_arr.map((v, i) => {
      return {
        name: v.name,
        value: (v.value) * 1.0 / sum
      }
    })
    for (let i = 0; i < data_arr.length; i++) {
      //绘制饼图
      let min = (cW > cH ? cH : cW); //获取canvas宽高的最小值
      agl = data_arr[i].value * pi2 + startAgl; //终点
      c.strokeStyle = color_arr[i];
      c.lineWidth = data_arr[i].value * min * 0.3; // 线的粗细
      c.beginPath();
      c.arc(cW / 2, cH / 2, min * 0.3, startAgl, agl, false); //画圆
      c.stroke();
      c.closePath();
      startAgl = agl;

      //绘制图例
      c.fillStyle = color_arr[i];
      c.fillRect(cW * 0.8, 50 + 18 * i, 16, 16);
      c.fillText(data_arr[i].name, cW * 0.8 + 20, 62 + 18 * i);
    }
  }

(2)调用方式:

let color = ['#0580F2', '#FAA732', '#E1575D', '#8B73CC', '#8CD123', '#4B53BA', '#429588'];
  let option = {
    color: color,
    data: [
      { name: '20', value: '20' },
      { name: '30', value: '30' },
      { name: '40', value: '40' },
      { name: '50', value: '50' },
      { name: '60', value: '60' },
    ]
  }
  drawCircle('myCanvas', option)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
IE下实现类似CSS3 text-shadow文字阴影的几种方法
May 11 HTML / CSS
时尚的CSS3进度条效果
Feb 22 HTML / CSS
利用CSS3实现单选框动画特效示例代码
Sep 26 HTML / CSS
HTML5 本地存储实现购物车功能
Sep 07 HTML / CSS
canvas实现圆绘制的示例代码
Sep 11 HTML / CSS
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
May 15 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
Jul 26 HTML / CSS
Html5实现文件异步上传功能
May 19 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
Jan 29 HTML / CSS
HTML5实现视频弹幕功能
Aug 09 HTML / CSS
Html5嵌入钉钉的实现示例
Jun 04 HTML / CSS
CSS3点击按钮圆形进度打钩效果的实现代码
Mar 30 HTML / CSS
基于canvas的骨骼动画的示例代码
Jun 12 #HTML / CSS
详解android与HTML混合开发总结
Jun 06 #HTML / CSS
Html5应用程序缓存(Cache manifest)
Jun 04 #HTML / CSS
Html5之title吸顶功能
Jun 04 #HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
Jun 01 #HTML / CSS
HTML5中的websocket实现直播功能
May 21 #HTML / CSS
深入浅析HTML5中的article和section的区别
May 15 #HTML / CSS
You might like
PHP中overload与override的区别
2017/02/13 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
JS实现留言板功能
2017/06/17 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
详解Python中heapq模块的用法
2016/06/28 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
Django项目中包含多个应用时对url的配置方法
2018/05/30 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
python中时间模块的基本使用教程
2019/05/14 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
化学相关工作求职信
2013/10/02 职场文书
园长自我鉴定
2013/10/06 职场文书
护士自我介绍信
2014/01/13 职场文书
大学生家政服务项目创业计划书
2014/01/30 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
基石观后感
2015/06/12 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
汽车销售合同文本
2019/08/08 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python
MySQL 如何限制一张表的记录数
2021/09/14 MySQL