canvas实现饼状图
效果图如下:

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实现饼状图的更多相关文章
- 封装构造函数,用canvas写饼状图和柱状图
封装构造函数,用canvas写饼状图和柱状图 封装函数 // 场景 function XDLScence( options ) { this.stage = options.stage; //执行场景 ...
- canvas图表详解系列(3):动态饼状图(原生Js仿echarts饼状图)
本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种图表,详细分解步 ...
- canvas学习之饼状图
接着上一节说,这次我使用canvas绘制了饼状图,主要是SectorGraph.js, 引入 import {canvasPoint} from '../../assets/js/canvas';im ...
- canvas+js画饼状图
效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- canvas制作柱形图/折线图/饼状图,Konva写动态饼状图
制作饼状图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- HTML5之Canvas绘图实例——饼状图
实现饼状分布画图(如下):调试环境:Firefox
- [BOT]自己动手实现android 饼状图,PieGraphView,附源码解析
本文要介绍的是一个参照手机支付宝app里面记账本功能里的"饼状图"实现的控件.通常app中可能的数据展示控件有柱状图,折线图,饼状图等,如果需要一个包含多种View控件的库,那么 ...
- [canvas]用canvas绘制饼状图
折线图之后又来饼状图啦~\(≧▽≦)/~啦啦啦 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 基于HTML5 Canvas的饼状图表实现教程
昨天我们分享了一款基于HTML5的线性图表应用,效果非常不错,可以看在线DEMO或者实现教程.今天我们继续来分享一款基于HTML5的网页图表,它也是利用Canvas绘制的,但是和前面不同的是,这款图表 ...
随机推荐
- C# Chart 曲线(多曲线展示)
//绑定显示曲线数据(Chart控件名:) //X轴标题 this.CurveChart.ChartAreas["ChartArea1"].AxisX.Title = " ...
- LeetCode 916. Word Subsets
原题链接在这里:https://leetcode.com/problems/word-subsets/ 题目: We are given two arrays A and B of words. E ...
- 大文件上传组件webupload插件
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- 洛谷P2607题解
想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断 ...
- 关于m3u8文件, ts文件解密, hls 解密. 一些记录
使用openssl 解密 openssl aes-128-cbc -d -in 原.ts -out 解密后.ts -nosalt -iv 偏移量 -K key16进制 其中 iv 偏移量和 key 一 ...
- modis数据处理的坑(MOD02,mod03,mod04,MCD19A2)
一直以来处理modis产品都是用的 modis conversion toolkit(MCTK),用 IDL 来跑感觉好像也没什么问题,好像并没有去验证结果到底对不对,因为用的气溶胶数据 MOD04_ ...
- VIM 命令速查表
今天整理一份 VIM 常用命令速查表,当做给自己备忘. 进入VIM 相关 命令 描述 vim filename 打开或者新建文件 vim +n filename 打开文件并将光标置于第n行行首 vim ...
- Python导入 from lxml import etree 导入不了
问题在学爬虫,Python 版本是2.7,安装的lxml包是4.3的,在 from lxml import etree 时发现一直报错,网上查询,原来是Python版本和lxml包版本不一致导致的. ...
- js - 常用工具集功能函数
Note [普通JSON数组插入指定位置并且合并] let arr = [{ a: 11 }, { a: 11 }, { a: 11 }, { a: 117 }, { a: 11 }, { a: 11 ...
- 【转】Android 将自己的应用改为系统应用
所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定.减少内存(DATA)空间占用.恢复出厂设置后不会消失.修改系统时间.调用隐藏方法.系统关机重启.静默安装升级卸载应用等 ...