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 相关文章推荐
CSS3弹性盒模型开发笔记(一)
Apr 26 HTML / CSS
CSS3线性渐变简单实现以及该属性在浏览器中的不同
Dec 12 HTML / CSS
CSS3实现莲花绽放的动画效果
Nov 06 HTML / CSS
html5自带表单验证体验优化及提示气泡修改功能
Sep 12 HTML / CSS
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
Apr 24 HTML / CSS
浅析border-radius如何兼容IE
Apr 19 HTML / CSS
HTML最新标准HTML5总结(必看)
Jun 13 HTML / CSS
HTML5 表单验证失败的提示语问题
Jul 13 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
Aug 29 HTML / CSS
html5手机键盘弹出收起的处理
Jan 20 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
Aug 17 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
Sep 16 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
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
php 中的closure用法详解
2017/06/12 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
Javascript面向对象编程
2012/03/18 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
Javascript的this详解
2019/03/23 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
Python实现大文件排序的方法
2015/07/10 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
Django实现celery定时任务过程解析
2020/04/21 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
请假条怎么写
2014/04/10 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
入党申请书怎么写?
2019/06/21 职场文书
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers
Axios代理配置及封装响应拦截处理方式
2022/04/07 Vue.js