当我们使用Echrts很Highcharts的时候,总是觉得各种统计图表是多么神奇,今天我就用现代浏览器支持的canvas来绘制饼状统计图,当然仅仅是画出图并没什么难度,但是统计图一般都有输入,根据不同的输入来绘制,需要发挥你脑力。

1.canvas简单使用

1.1先看我们的html,需要一个绘图的区域

  1. <canvas id="drawing" width="500px" height="500px"></canvas>

1.2获取绘图区域,并且判断浏览器是否支持canvas绘图

  1. var drawing = document.getElementById('drawing')//获取绘图区域
  2. if(drawing.getContext){
  3. context = drawing.getContext('2d')
  4. }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开始封装绘制方法

  1. /*下列插件传递json的格式{
         ele:ele
        data:[1,2,3,4]
  2. }*/
  3. function Circle(json) {
  4. this.ele = json.ele;//绘制区域元素
  5. this.data = json.data;//输入的数据
  6. this.step = 0;//绘制的步骤,几个数据,分几次绘制
  7. this.start=0;//其实位置初始化
  8. this.end = 0;//借宿位置初始化
  9. this.init(); //调用初始化方法
  10. }
  11. Circle.prototype.init=function(){
  12. if(this.ele.getContext){ //判断知否支持canvas
  13. this.context = this.ele.getContext('2d')
  14. }else{
  15. console.log('不支持canvas')
  16. }
  17. this.sum() //先统计数据和,以便得到每个数据的占比
  18. this.drawing() //开始绘制
  19. }
  20. Circle.prototype.drawing=function(){
  21. if(this.step >= this.data.length){//超过数据个数,就停止绘制
  22. return
  23. }
  24. this.math()//计算起点和终点
  25. this.context.beginPath();//绘制开始
  26. this.context.fillStyle = Circle.prototype.color();//填充颜色
  27. this.context.moveTo(250,250)//绘制起点移动到的位置,moveTo就像抬笔到某处,过程中不留下痕迹
  28. this.context.arc(250,250,160,this.start,this.end,false)//画圆开始,属性分别是('圆心X轴坐标','原型Y轴坐标','起点','终点',是否逆时针)
  29. this.context.lineTo(250,250)//再绘制直线到圆心,这样形成封闭区域,才可以填充颜色
  30. this.context.fill()//填充颜色
  31. this.context.closePath();//关闭绘图
  32. this.step++;//接着下一步骤的绘制
  33. this.drawing()
  34. }
  35. Circle.prototype.math = function(start,end){//每次绘制是计算起点和终点
  36. this.start=this.end;
  37. this.end = this.start+this.data[this.step]/this.total*2*Math.PI;
  38. }
  39. Circle.prototype.color=function(){//随机颜色的生成
  40. var color="#";
  41. for(var i = 0;i < 6;i++){
  42. color+= parseInt(Math.random()*17).toString(16);
  43. }
  44. return color;
  45. }
  46. Circle.prototype.sum = function(){//得到数据的总和,以便得到每个数据的占比
  47. this.total = this.data.reduce(function(a, b){
  48. return a + b;
  49. });
  50. }

2.2调用方法

  1. var drawing = document.getElementById('drawing')
  2. var img =new Circle({
  3. ele:drawing,
  4. data:[1,2,3,4]
  5. })

2.3查看效果图,(因为我们的填充颜色是随机的,所以每次刷新的饼状图每部分的颜色都会变化)

我的源码地址在https://github.com/jiangzhenfei/canvas/blob/master/circle.html

canvas动态绘制饼状图,的更多相关文章

  1. Canvas(3)---绘制饼状图

    Canvas(3)---绘制饼状图 有关canvas之前有写过两篇文章 1.Canvas(1)---概述+简单示例 2.Canvas(2)---绘制折线图 在绘制饼状图之前,我们先要理解什么是圆弧,如 ...

  2. 第166天:canvas绘制饼状图动画

    canvas绘制饼状图动画 1.HTML <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  3. 用PNChart绘制饼状图简介

    写在前面 最近做的小Demo中有一个绘制饼状图的需求.在开始实现之前上网了解了一下现有的一些绘制图形的第三方库,相应的库还是有挺多的,PNChart便是其中一个.PNChart是一个90后的中国boy ...

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

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

  5. Graphic系统综合练习案例-绘制饼状图

    这里用一个案例来将之前学过的关于绘制相关的东东加强巩固一下,纯绘制,木有加点击效果,先来看下最终效果: github中这种百分比饼图的效果非常非常之多,实际在项目中开发当产品有这样类似的需求时做为开发 ...

  6. IOS之以UIBezierPath绘制饼状图

    1.绘制的饼状图是通过多个扇形拼和而成,绘制一个扇形也是比较简单的,核心代码如下: 先画一条圆弧,再画半径,接着再画一条圆弧,最后闭合路径: UIBezierPath*  aPath = [[UIBe ...

  7. [Echarts]用Echarts绘制饼状图

    在项目网站的网页中,有这样一幅图: 心血来潮,想使用百度Echarts来绘制一下,可是没能绘制得完全一样,Echarts饼状图的label不能在图形下面放成一行,最后的效果是这样子的: 鼠标移动到it ...

  8. d3绘制饼状图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. matplotlib绘制饼状图

    源自http://blog.csdn.net/skyli114/article/details/77508430?ticket=ST-41707-PzNbUDGt6R5KYl3TkWDg-passpo ...

随机推荐

  1. [转] 前端开发利器--Brackets 的七种武器和旁门左道

    转自:http://www.jianshu.com/p/ff7798aa4548 Brackets是Adobe开发的web编辑器,是一款免费开源.多平台支持的软件,并在于GitHub上维护.Brack ...

  2. node 发送 post 请求 get请求。

    因为我们部门打算用node请求restful 然后慢慢替换掉服务端,以后直接请求soa的接口,让前端的数据更贴切项目,因为我们服务端接口和app公用一套,由于业务的需求和版本不统一(例如app6.4的 ...

  3. java通过句柄访问对象

    在Java里,任何东西都可看作对象.尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle),有的人将其称作一个“引用”,甚至一个“指针”. 主类型的数据成员可直接初始化, ...

  4. 每天一个Linux命令(12):su命令

    su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码. 语法: su(选项)(参数) 选项: -c<指令>或--command=<指令>:执行完指定 ...

  5. Selenide 简单实现自动化测试

    Selenide 网址:http://selenide.org/ github 地址:https://github.com/codeborne/selenide Selenide 早些年一直使用,中间 ...

  6. Android Spiner实现Key-Value

    原网址:http://www.eoeandroid.com/thread-29687-1-1.html?_dsign=02d5cd6a 学习到的方法,直接上代码了: 1.定义一个class publi ...

  7. 梳理 Opengl ES 3.0 (一)宏观着眼

    Opengl ES 可以理解为是在嵌入式设备上工作的一层用于处理图形显示的软件,是Opengl 的缩水版本. 下图是它的工作流程示意图: 注意图中手机左边的EGL Layer Opengl ES是跨平 ...

  8. kaldi GMM模型解码指令 gmm-latgen-faster详解

    目录 - 作用: - 用法: - 可选项及含义: - 使用实例: - 作用: Generate lattices using GMM-based model. 生成基于GMM模型的lattice词格) ...

  9. 官方文档 恢复备份指南七 Using Flashback Database and Restore Points

    本章内容: Understanding Flashback Database, Restore Points and Guaranteed Restore Points Logging for Fla ...

  10. Week2 Teamework from Z.XML 软件分析与用户需求调查(四)Bing桌面及助手的现状与发展

    一.Bing搜索的相关背景 第一,必应搜索前几年的发展重点在于欧美市场,并且取得了一定的成效:根据 Hitwise 的统计数据,Bing 在 2011年3 月份市场占有率突破了 30% 大关,达到 3 ...