效果图如下:

html:

<canvas id="myCanvas" width="500" height="500"></canvas>

js:

 toCanvas(arr) {
let canvas = document.getElementById('myCanvas');//获取canvas
let ctx = canvas.getContext('2d');//通过getContext获取画图的环境
let cont = 0; //总数
let start = 0; //起始弧度
let x = 250,
y = 250; //圆点坐标
let startCoordinate = {
start: 200,
end: 100
}; //绘制起点坐标
arr.forEach((item) => {
cont += item.number;
}); //获取number之和
arr.forEach((item) => {
ctx.beginPath(); //初始化路径
let prop = item.number / cont; //计算比例
let radian = prop * (Math.PI * 2); //计算弧度
ctx.arc(x, y, 100, start, start + radian, false);//根据比例和弧度画圆
ctx.lineTo(x, y); //连接圆心画线
ctx.fillStyle = item.color; //设置圆弧颜色
ctx.fill(); //填充样式
let x1 = x + Math.cos(radian / 2 + start) * 100;//获取圆弧中间点X坐标
let y1 = y + Math.sin(radian / 2 + start) * 100;//获取圆弧中间点y坐标
ctx.moveTo(x1, y1);//画笔移动到圆弧中点
ctx.lineTo(x1 + 30 * Math.cos(radian / 2 + start), y1 + 30 * Math.sin(radian / 2 + start));//在圆弧中点和圆心的连线上画30单位长度的线
let proNumber = null;
if (Math.cos(radian / 2 + start) > 0) {
proNumber = 1
} else {
proNumber = -1
}//判断起点半径与当前圆弧线所成角的余弦值是为负数/正数
ctx.lineTo(x1 + 30 * Math.cos(radian / 2 + start) + proNumber * 30, y1 + 30 * Math.sin(radian / 2 + start));//在之前线的基础上画一条30单位长度的水平线
ctx.fillText(item.name, x1 + 30 * Math.cos(radian / 2 + start) + proNumber * 20, y1 + 30 * Math.sin(radian / 2 + start) - 5, 30);//在线上填充字体,设置字体的坐标,最大长度
ctx.strokeStyle = item.color;//设置线条和字体的颜色
ctx.font = "bold 10px consolas";//设置字体的样式
start += radian;//每次圆弧渲染完成将弧度累加作为下个圆弧的初始弧度
ctx.stroke();//渲染线条
})
let small = new Path2D(ctx);//创建新的一个路径
small.arc(x, y, 60, 0, Math.PI * 2, false);//画圆
ctx.fillStyle = "#fff";//设置圆的颜色
ctx.fill(small);//填充small
},
 let arrs = [{
name: '1号',
color: '#CD853F',
number: 500
},
{
name: '2号',
color: '#FFA500',
number: 500
},
{
name: '3号',
color: '#FF4500',
number: 200
},
{
name: '4号',
color: '#8B0000',
number: 300
},
{
name: '5号',
color: '#DAA520',
number: 50
},
]
this.toCanvas(arrs);

  有些不满意的是文字没有和底下的线条保持一致的margin,也找了很多方法依然没有成功。有大神看到了麻烦指点一下。万分感谢。

canvas实现饼状图的更多相关文章

  1. 封装构造函数,用canvas写饼状图和柱状图

    封装构造函数,用canvas写饼状图和柱状图 封装函数 // 场景 function XDLScence( options ) { this.stage = options.stage; //执行场景 ...

  2. canvas图表详解系列(3):动态饼状图(原生Js仿echarts饼状图)

    本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种图表,详细分解步 ...

  3. canvas学习之饼状图

    接着上一节说,这次我使用canvas绘制了饼状图,主要是SectorGraph.js, 引入 import {canvasPoint} from '../../assets/js/canvas';im ...

  4. canvas+js画饼状图

    效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  5. canvas制作柱形图/折线图/饼状图,Konva写动态饼状图

    制作饼状图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  6. HTML5之Canvas绘图实例——饼状图

    实现饼状分布画图(如下):调试环境:Firefox

  7. [BOT]自己动手实现android 饼状图,PieGraphView,附源码解析

    本文要介绍的是一个参照手机支付宝app里面记账本功能里的"饼状图"实现的控件.通常app中可能的数据展示控件有柱状图,折线图,饼状图等,如果需要一个包含多种View控件的库,那么 ...

  8. [canvas]用canvas绘制饼状图

    折线图之后又来饼状图啦~\(≧▽≦)/~啦啦啦 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  9. 基于HTML5 Canvas的饼状图表实现教程

    昨天我们分享了一款基于HTML5的线性图表应用,效果非常不错,可以看在线DEMO或者实现教程.今天我们继续来分享一款基于HTML5的网页图表,它也是利用Canvas绘制的,但是和前面不同的是,这款图表 ...

随机推荐

  1. Java检查异常、非检查异常、运行时异常、非运行时异常的区别

    Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类. Java的异常(Exception和Error)分为检查异常和非检查的异常. 其 ...

  2. dependencies与devDependencies的区别----npm install

    npm install在安装node模块时,有两种命令参数可以把它们的信息写入package.json文件. –save –save-dev 那二者的区别在哪里呢? –save会把依赖包名称添加到pa ...

  3. 腾讯蓝鲸cmdb部署

    蓝鲸配置平台 (CMDB)http://172.16.6.10:8088 环境(单机测试): Centos6 16G 200G 依赖环境: Java 1.8.0_92 python 2.7 ZooKe ...

  4. cf1173 D. Nauuo and Circle

    链接 [cf]http://codeforces.com/contest/1175/problem/F) 思路 当1在1的位置做dp[i]为i的子树所有的方案. 一条性质是i的子树所占圆上的位置一定一 ...

  5. P3386 【模板】二分图匹配(匈牙利算法)

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  6. uni-app 获取网络状态

    uni.getNetworkType(OBJECT) 获取网络类型. OBJECT 参数说明 参数名 类型 必填 说明 success Function 是 接口调用成功,返回网络类型 network ...

  7. 【BIEE】导出大量数据报错处理请求时出现致命错误。服务器响应为 com.siebel.analytics.utils.InputStreamWithLimit$ReadOverTheLimitException

    问题描述 在使用BIEE导出大量数据的时候,报错如下: 处理请求时出现致命错误.服务器响应为: com.siebel.analytics.utils.InputStreamWithLimit$Read ...

  8. [Web Pdf] flying-saucer + iText + Freemarker生成pdf 跨页问题

    转载于: https://blog.csdn.net/qq_31980421/article/details/79662988 flying-saucer + iText +  Freemarker实 ...

  9. Beef搭建并通过Nginx绑定域名

    Beef和Nginx安装过程这里就不再说明了相关链接:Beef官方安装教程 1. 修改Beef的config.yaml配置文件 xss连接地址改成要绑定的域名 sudo vim /beef/confi ...

  10. 009 webpack将ES高级语法进行装换

    一:ES高级转换 1.main.js中的js不能解析 // js的主要入口 import $ from 'jquery' import './css/index.css' import './css/ ...