开源的图表库已经有很多了,这里从头写个自己的,主要还是 提高自己js的水平,增加复杂代码组织的经验

首先写一个画图的库,供以后画图表使用。经过2天的开发,算是能拿出点东西了,虽然功能还很弱,但是有了一些基本的架子。写了两个examples,发在了github上

1.一个简单的测试,没有啥意义

2.一个稍微规整的例子,有点图表的意思

下面分析一下第二个例子的代码,第二个例子效果大致如下图

看一下代码(请自行右键点击查看),很简短,

先是做一些配置

   1:              var render = new exports.Render();
   2:              render.register("lines",exports.Lines);
   3:              render.register("circles",exports.Circles)
   4:              var ctx = document.getElementById("myCanvas").getContext("2d");
   5:              var board = new exports.CanvasBoard({"ctx":ctx});


准备数据并画图,先是横着的5根线

   1:             render.lines("hGrid")
   2:                  .data({x1:50,x2:750},function(d,i){
   3:                          d.y1 = d.y2 = (i+1)*100;
   4:                          return d;
   5:                      },5)
   6:                  .style({strokeStyle:"blue"})
   7:                  .draw(board);

如果以前接触过 d3  这个库的话,应该看着很眼熟。的确是借鉴了d3的风格,不过我没仔细研究过d3的代码,完全是自己根据api的样子捉摸出来的。

1. lines 是通过render.register 注册进render的,见一段代码的第2行

2.data 函数的定义是 funciton data (data, f,num),他的规则比较复杂,

当data 是数组时 num实际不起作用
如果f 不是函数,那么lines 将构建data.length 个Line 对象,每一个Line对象的属性是相应data[i]的一份深拷贝 ;

如果f是函数,那么lines 将构建data.length 个Line 对象,每个Line对象是执行 f( data[i], i ) 的结果。此时需要自定义函数function(d,i){},d 是相应data[i]的深拷贝,可以在函数里面更改d,不会影响data本身,i是基于0的索引。最后需要return d 。对于 Line对象,为了作图,应该至少提供x1,y1, x2, y2四个属性

当data 不是数组,是一个对象时 如果不指定num,num为1. 
如果f 不是函数,lines 将构建num 个Line对象,line对象的属性 和data 一样;

如果f是函数,lines 将构建num个Line对象,line对象的属性 是执行了 f(d,i)后的结果。此时 每个d的属性是一样的,i从0 到 num - 1

对于 Line对象,为了作图,应该至少提供x1,y1, x2, y2四个属性

有点复杂,这是我纠结了半天 确定下来的,的确可以提高效率。上面画横线的情况,对应对 data 是Object,f是函数,num=5的情况

3.style 的函数第一 function style(sty,f) ,整体思路和data一致,对lines中的每个对象设置style。这些style属性用来控制canvas 绘图,比如strokeStyle、lineWidth属性,这里每个线段的样式是一样的,所以就简单的传个对象就行了

4 draw函数,画图,需要传一个画板对象,这里是CanvasBoard的一个实例


画7根竖线

   1:              render.lines("vGrid")
   2:                  .data({y1:50,y2:550},function(d,i){
   3:                          d.x1 = d.x2 = (i+1)*100;
   4:                          return d;
   5:                      },7)
   6:                  .style({strokeStyle:"blue"})
   7:                  .draw(board);

这代码和上面一样。


随机画100个圆

   1:              var data = [];
   2:              for(var i = 0;i<100;i++){
   3:                  data.push({x:Math.random()*700+50,y:Math.random()*500+50,r:10});
   4:              }
   5:              render.circles("random point")
   6:                  .data(data)
   7:                  .style({fillStyle:"red"})
   8:                  .draw(board);

这里 先把数据完全准备好,然后传进去就行。

当然也可以用下面这种等价的方式,也是推荐的方式,不过一般情况下,可能要适应一段时间

   1:              render.circles("random point")
   2:                  .data({r:10},function(d,i){
   3:                           d.x = Math.random()*700+50;
   4:                           d.y = Math.random()*500+50;
   5:                           return d;
   6:                      },100)
   7:                  .style({fillStyle:"red"})
   8:                  .draw(board);

准备开发一个基于canvas的图表库,记录一些东西(一)的更多相关文章

  1. sChart.js:一个小型简单的图表库

    介绍 sChart.js 作为一个小型简单的图表库,没有过多的图表类型,只包含了柱状图.折线图.饼状图和环形图四种基本的图表.麻雀虽小,五脏俱全.sChart.js 基本可以满足这四种图表的需求.而它 ...

  2. 【前端酷站】分享一个纯 Javascript 的图表库与立体像素风制作~

    今天小编为大家推荐一个神奇的酷站.ECharts,一个纯 Javascript 的图表库. 以下是各个几个不错的界面的介绍: 首页:http://echarts.baidu.com/ 在首页有完整的说 ...

  3. Axios 是一个基于 promise 的 HTTP 库

    Axios 是一个基于 promise 的 HTTP 库 vue项目中关于axios的简单使用 axios介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.j ...

  4. 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)

    最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...

  5. Flutter ChartSpace:通过跨端 Canvas 实现图表库

    基于Flutter 的图形语法库,通过跨端 Canvas ,将基于 Javascript 的图形语法库 ChartSpace 扩展至 Flutter 端 作者:字节跳动终端技术--胡珀 背景 数据平台 ...

  6. 使用webpack4搭建一个基于Vue的组件库

    组内负责的几个项目都有一些一样的公共组件,所以就着手搭建了个公共组件开发脚手架,第一次开发 library,所以是参考着 iview 的配置来搭建的.记录如何使用webpack4搭建一个library ...

  7. 手把手做一个基于vue-cli的组件库(上篇)

    基于vue-cli4的ui组件库,先贴个最终效果吧,步骤有点多,准备分上下篇,上篇:如何做一个初步的组件.下篇:编写说明文档及页面优化.开工. GitHub源码地址:https://github.co ...

  8. 开发一个基于 Android系统车载智能APP

    很久之前就想做一个车载相关的app.需要实现如下功能: (1)每0.2秒更新一次当前车辆的最新速度值. (2)可控制性记录行驶里程. (3)不连接网络情况下获取当前车辆位置.如(北京市X区X路X号) ...

  9. 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(2)

    第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 为Domain Model添加约束 前一部分, 我们已经把数据库创建出来了. 那么我们先看看这个数据库 ...

随机推荐

  1. h.264参考图像列表、解码图像缓存

    1.参考图像列表(reference picture list) 一般来说,h.264会把需要编码的图像分为三种类型:I.P.B,其中的B.P类型的图像由于采用了帧间编码的这种编码方式,而帧间编码又是 ...

  2. android 状态栏(StatusBar)

    一.SystemUI 概述 自 android2.2 开始 , 原本存在与 framework-res.apk 中的状态栏和下拉通知栏界面控制被分割出一个单独的 apk 文件 , 命名为 System ...

  3. MyEclipse10 中增加svn插件

    http://www.cnblogs.com/bluesky4485/archive/2012/04/23/2467177.html 确实这种方法可行!向牛人学习!

  4. Power Network (最大流增广路算法模板题)

    Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20754   Accepted: 10872 Description A p ...

  5. 高质量JavaScript代码书写基本要点学习

    高质量JavaScript代码书写基本要点学习 可维护的代码意味着: •可读的 •一致的 •可预测的 •看上去就像是同一个人写的 •已记录   最小全局变量(Minimizing Globals)   ...

  6. Hbase 计数器

    Hbase计数器可以用于统计用户数,点击量等信息 基本操作 可以使用incr操作计数器,incr语法格式如下: incr '<table>', '<row>', '<co ...

  7. HDOJ(HDU) 1799 循环多少次?(另类杨辉三角)

    Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次 ...

  8. STL_iterator迭代器(1)——迭代器的分类

    一.容器迭代器 尽管C++指针也是迭代器,但用的更多的是容器迭代器.容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取迭代器对象.两个典型的容 ...

  9. K - Leapin' Lizards - HDU 2732(最大流)

    题意:在一个迷宫里面有一些蜥蜴,这个迷宫有一些柱子组成的,并且这些柱子都有一个耐久值,每当一只蜥蜴跳过耐久值就会减一,当耐久值为0的时候这个柱子就不能使用了,每个蜥蜴都有一个最大跳跃值d,现在想知道有 ...

  10. angular 按需加载

     angular.module('app',[]) .controller('ctrl',function ($http,$scope){ //ctrl控制器,名称作用的范围 html中ng-cont ...