canvas动态绘制饼状图,
当我们使用Echrts很Highcharts的时候,总是觉得各种统计图表是多么神奇,今天我就用现代浏览器支持的canvas来绘制饼状统计图,当然仅仅是画出图并没什么难度,但是统计图一般都有输入,根据不同的输入来绘制,需要发挥你脑力。
1.canvas简单使用
1.1先看我们的html,需要一个绘图的区域
<canvas id="drawing" width="500px" height="500px"></canvas>
1.2获取绘图区域,并且判断浏览器是否支持canvas绘图
var drawing = document.getElementById('drawing')//获取绘图区域
if(drawing.getContext){
context = drawing.getContext('2d')
}else{
alert('浏览器不支持canvas')
}
1.3介绍简单的api(这里的context指的是上面获取的绘图区域)
context.beginPath() 绘图开始,一个图可以分多次绘制,例如饼状图每个小部分都是一次完整的绘制,为了填充不同颜色,都需要多次开始和结束
context.closePath() 本部分绘制结束
context.moveTo(100,100) 抬笔移动到100,100位置,过程中不留下痕迹
context.lineTo(100,100) 从某个起点绘制到100,100这个坐标的,
context.fill() 开始填充,可以先设置填充颜色,context.fillStyle = 'blue';设置填充色,然后在调用context.fill()开始填充本部分
context.stroke() 描边,就是轮廓的颜色,可以先设置颜色,context.strokeStyle="red",然后调用context.stroke()描边
2.开始我们的封装绘制方法
2.1开始封装绘制方法
/*下列插件传递json的格式{
ele:ele
data:[1,2,3,4]
}*/
function Circle(json) {
this.ele = json.ele;//绘制区域元素
this.data = json.data;//输入的数据
this.step = 0;//绘制的步骤,几个数据,分几次绘制
this.start=0;//其实位置初始化
this.end = 0;//借宿位置初始化
this.init(); //调用初始化方法
}
Circle.prototype.init=function(){
if(this.ele.getContext){ //判断知否支持canvas
this.context = this.ele.getContext('2d')
}else{
console.log('不支持canvas')
}
this.sum() //先统计数据和,以便得到每个数据的占比
this.drawing() //开始绘制
}
Circle.prototype.drawing=function(){
if(this.step >= this.data.length){//超过数据个数,就停止绘制
return
}
this.math()//计算起点和终点
this.context.beginPath();//绘制开始
this.context.fillStyle = Circle.prototype.color();//填充颜色
this.context.moveTo(250,250)//绘制起点移动到的位置,moveTo就像抬笔到某处,过程中不留下痕迹
this.context.arc(250,250,160,this.start,this.end,false)//画圆开始,属性分别是('圆心X轴坐标','原型Y轴坐标','起点','终点',是否逆时针)
this.context.lineTo(250,250)//再绘制直线到圆心,这样形成封闭区域,才可以填充颜色
this.context.fill()//填充颜色
this.context.closePath();//关闭绘图
this.step++;//接着下一步骤的绘制
this.drawing()
}
Circle.prototype.math = function(start,end){//每次绘制是计算起点和终点
this.start=this.end;
this.end = this.start+this.data[this.step]/this.total*2*Math.PI;
}
Circle.prototype.color=function(){//随机颜色的生成
var color="#";
for(var i = 0;i < 6;i++){
color+= parseInt(Math.random()*17).toString(16);
}
return color;
}
Circle.prototype.sum = function(){//得到数据的总和,以便得到每个数据的占比
this.total = this.data.reduce(function(a, b){
return a + b;
});
}
2.2调用方法
var drawing = document.getElementById('drawing')
var img =new Circle({
ele:drawing,
data:[1,2,3,4]
})
2.3查看效果图,(因为我们的填充颜色是随机的,所以每次刷新的饼状图每部分的颜色都会变化)

我的源码地址在https://github.com/jiangzhenfei/canvas/blob/master/circle.html
canvas动态绘制饼状图,的更多相关文章
- Canvas(3)---绘制饼状图
Canvas(3)---绘制饼状图 有关canvas之前有写过两篇文章 1.Canvas(1)---概述+简单示例 2.Canvas(2)---绘制折线图 在绘制饼状图之前,我们先要理解什么是圆弧,如 ...
- 第166天:canvas绘制饼状图动画
canvas绘制饼状图动画 1.HTML <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 用PNChart绘制饼状图简介
写在前面 最近做的小Demo中有一个绘制饼状图的需求.在开始实现之前上网了解了一下现有的一些绘制图形的第三方库,相应的库还是有挺多的,PNChart便是其中一个.PNChart是一个90后的中国boy ...
- [canvas]用canvas绘制饼状图
折线图之后又来饼状图啦~\(≧▽≦)/~啦啦啦 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- Graphic系统综合练习案例-绘制饼状图
这里用一个案例来将之前学过的关于绘制相关的东东加强巩固一下,纯绘制,木有加点击效果,先来看下最终效果: github中这种百分比饼图的效果非常非常之多,实际在项目中开发当产品有这样类似的需求时做为开发 ...
- IOS之以UIBezierPath绘制饼状图
1.绘制的饼状图是通过多个扇形拼和而成,绘制一个扇形也是比较简单的,核心代码如下: 先画一条圆弧,再画半径,接着再画一条圆弧,最后闭合路径: UIBezierPath* aPath = [[UIBe ...
- [Echarts]用Echarts绘制饼状图
在项目网站的网页中,有这样一幅图: 心血来潮,想使用百度Echarts来绘制一下,可是没能绘制得完全一样,Echarts饼状图的label不能在图形下面放成一行,最后的效果是这样子的: 鼠标移动到it ...
- d3绘制饼状图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- matplotlib绘制饼状图
源自http://blog.csdn.net/skyli114/article/details/77508430?ticket=ST-41707-PzNbUDGt6R5KYl3TkWDg-passpo ...
随机推荐
- C++学习006-条件运算符
这里我也理解的不咋的,大致意思应该就是根据运算符号 的优先级不同来解决的 条件运算符是其中一部分,而条件运算符具有右结合性,当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与理他最近的冒号配 ...
- Python登录小程序
------------------------------------------------- 主要实现功能 1.用户输入用户名,在用户名文件中查找对应的用户,若无对应用户名则打印输入错误 2.用 ...
- Halcon和Opencv区别
Halcon:机器视觉行业里知名的商业视觉库,非开源的,在国内市场份额处于第一,其提供了1500个多个API算子供开发人员使用,有些编程基础的都可以轻松的入门,其调试也是很方便的,断点单步运行,图像变 ...
- 机器视觉必知-GenICam相机通用接口标准
机器视觉必知-GenICam相机通用接口标准 GenICam(相机通用接口): 一种通用软件接口 通用相机接口标准 目前机器视觉行业所使用的相机几乎均以相同方式来进行配置,即:---通过在注册表中的读 ...
- java设计模式之责任链模式以及在java中作用
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
- 数据结构14——AC自动机
一.相关介绍 知识要求 字典树Trie KMP算法 AC自动机 多模式串的字符匹配算法(KMP是单模式串的字符匹配算法) 单模式串问题&多模式串问题 单模就是给你一个模式串,问你这个模式串是否 ...
- Linux TCP协议使用的变量
Linux /proc/sys/net/ipv4/* 变量 TCP变量:somaxconn - INTEGER listen()的backlog参数的上限,在用户态为SOMAXCONN.默认是1 ...
- lintcode-135-数字组合
135-数字组合 给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T.C中的数字可以无限制重复被选取. 例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为: [7 ...
- LeetCode--Factorial Trailing Zeroes(注意)
Given an integer n, return the number of trailing zeroes in n!. 问题描述:给出一个正整数n,计算n!结构后面有几个0.要求:在多项式时间 ...
- 51nod 1831 小C的游戏(博弈论+打表)
比较坑的题目. 题意就是:给出一堆石子,一次操作可以变成它的约数个,也可以拿只拿一个,不能变成一个,最后拿的人输. 经过打表发现 几乎所有质数都是先手必败的,几乎所有合数都是先手必胜的 只有几个例外, ...