canvas 实现 柱状图
define([],function(){
var myChart={
init:function(options){
this.ctx = options.ctx;
this.data = options.data;
this.yInterval =options.yInterval||10;
this.marginX=options.marginX||8
this.w1=options.w1||25
this.ox=options.ox||30
this.yearMoney=options.yearMonty
this.bottom=70
this.draw()
},
setUnderLine:function(a,b){
this.ctx.beginPath()
this.ctx.lineWidth = 0.6
this.ctx.strokeStyle="#999999"
var dataCollection = this.dataarray[0].datacollection;
if(b){
x1=a*(this.w1+this.marginX)+this.ox
x2=b*(this.w1+this.marginX)+this.ox
x3=24*(this.w1+this.marginX)+this.ox
}
/* this.ctx.moveTo(this.ox+this.w1, this.ctx.canvas.clientHeight -10);
this.ctx.lineTo(dataCollection.length*(this.w1+this.marginX)+this.ox-this.marginX, this.ctx.canvas.clientHeight -10 );
this.ctx.stroke();*/
var yearText= _.keys(this.yearMoney)
var yearValue= _.values(this.yearMoney)
for(var i=0;i<=(dataCollection.length-1)/12;i++){
var x1=i*(this.w1+this.marginX)*12+this.ox+this.w1
var y1=this.ctx.canvas.clientHeight -10
var y2=this.ctx.canvas.clientHeight -30
this.ctx.beginPath()
this.ctx.moveTo(x1, y1 );
this.ctx.lineTo(x1, y2 );
this.ctx.stroke();
this.ctx.beginPath()
if(i<(dataCollection.length-1)/12){
this.ctx.moveTo(x1, this.ctx.canvas.clientHeight-10);
this.ctx.lineTo(x1+140, this.ctx.canvas.clientHeight-10)
}
if(i>0){
this.ctx.moveTo(x1, this.ctx.canvas.clientHeight -10 );
this.ctx.lineTo(x1-140,this.ctx.canvas.clientHeight -10);
}
this.ctx.stroke();
this.ctx.fillStyle="black"
this.ctx.fillText(yearText[i]+"年业绩", x1+165 ,this.ctx.canvas.clientHeight -15);
/*this.ctx.fillStyle="#64B7E9"*/
this.ctx.fillText(yearValue[i], x1+170 ,this.ctx.canvas.clientHeight -1);
}
this.ctx.fillStyle="#8dbb42"
this.ctx.fillText("入职",this.data.n1*(this.w1+this.marginX)+this.ox+this.w1-16,this.ctx.canvas.clientHeight -40);
/* this.ctx.fillText("职",this.data.n1*(this.w1+this.marginX)+this.ox+this.w1-6,this.ctx.canvas.clientHeight -25);*/
},
drawCloumn:function(){
var x = this.ox+this.w1
var y = this.ctx.canvas.clientHeight;
var colors = ["#AEDAF5", "#FFCC00"];
for (var i = 0; i < this.dataarray.length; i++) {
dataCollection = this.dataarray[i].datacollection;
this.ctx.beginPath();
this.ctx.lineWidth = this.w1;
this.ctx.strokeStyle = colors[i];
for (var j = 0; j < dataCollection.length; j++) {
metaData = dataCollection[j];
this.ctx.moveTo(x, y - this.bottom);
this.ctx.lineTo(x, y - this.bottom - (metaData.amount / this.yInterval) * 50 );
this.ctx.stroke();
this.ctx.fillStyle="black"
//绘制柱的金额
this.ctx.font = "10px Arial";this.ctx.textAlign = "start";
if(metaData.amount!==""){
this.ctx.fillStyle="black"
var amountTMP=metaData.amount*1
amountTMP= amountTMP.toFixed(2)
if(amountTMP==0.00){
amountTMP=" "
}
}
else{
this.ctx.fillStyle="#999999"
amountTMP=" "
}
this.ctx.fillText(amountTMP, x-15, y - this.bottom - 1 - (metaData.amount / this.yInterval) * 50);
//绘制柱的标题
this.ctx.font = "12px Arial";
this.ctx.fillText(metaData.title, x-this.w1/2 , y -this.bottom+15);
x += (this.categoryCount * this.w1 + this.marginX);
}
/*ffffffffffff*/
var aa=this.ox+this.w1
for (var j = 0; j < dataCollection.length; j++) {
this.ctx.beginPath()
this.ctx.lineWidth = 1
this.ctx.strokeStyle="#999999"
this.ctx.moveTo(aa, y - this.bottom);
this.ctx.lineTo(aa, y - this.bottom+5);
this.ctx.stroke();
aa+= (this.categoryCount * this.w1 + this.marginX);
}
/*ddddddd*/
x = 80 + 30 * (i + 1);
}
},
draw:function(){
//柱状图标题
var title = this.data.title;
//Y轴标题
var verticaltitle = this.data.verticaltitle;
//X轴标题
var horizontaltitle = this.data.horizontaltitle;
//颜色
var colors = ["#AEDAF5", "#FFCC00"];
this.dataarray = this.data.data;
var dataCollection;
var metaData;
var maxamount = 0;
this.categoryCount = this.dataarray.length;
this.dataCount = this.dataarray[0].datacollection.length;
//找出最大的数值,以便绘制Y轴的刻度。
for (var i = 0; i < this.dataarray.length; i++) {
dataCollection = this.dataarray[i].datacollection;
for (var j = 0; j < dataCollection.length; j++) {
metaData = dataCollection[j]; /*alert(metaData.amount);*/
maxamount = (new Number(metaData.amount) > maxamount) ? metaData.amount : maxamount;
}
}
this.maxAmount=maxamount
//动态设置 canvas 的尺寸
this.ctx.canvas.height = Math.ceil(this.maxAmount / this.yInterval) * 50 + 100; //120 is for the chart title.
this.ctx.canvas.width = this.categoryCount * this.dataCount * this.w1 + this.dataCount*this.marginX + 50; //150 is for right side index
$("#myCanvasDiv").scrollLeft($("#myCanvasDiv")[0].scrollWidth)
/* this.verticalbar()*/
this.horizontalbar()
this.drawCloumn()
this.setUnderLine()
},
verticalbar:function(){
//计算需要绘制几个刻度
var segmentcount = Math.ceil(this.maxAmount / this.yInterval);
//Y轴的高度
var height = segmentcount * 50;
this.height=height
//绘制Y轴
this.ctx.beginPath();
this.ctx.lineWidth = 1;
this.ctx.strokeStyle = "#999999";
this.ctx.moveTo(this.ox, this.ctx.canvas.clientHeight - this.bottom);
this.ctx.lineTo(this.ox, this.ctx.canvas.clientHeight - this.bottom - height - 20);
this.ctx.stroke();
//绘制刻度数
this.ctx.font = "12px Arial";
this.ctx.textAlign = "end";
this.ctx.fillText("0", this.ox-10, this.ctx.canvas.clientHeight - this.bottom);
for (var j = 1; j < segmentcount + 1; j++) {
/* this.ctx.lineWidth = 1;
this.ctx.strokeStyle = "#999999";*/
this.ctx.beginPath();
this.ctx.moveTo(this.ox, this.ctx.canvas.clientHeight - this.bottom - (j ) * 50 );
this.ctx.lineTo(this.ox-10, this.ctx.canvas.clientHeight -this.bottom - (j ) * 50 );
this.ctx.stroke();
this.ctx.fillText(this.yInterval * j, this.ox-10 , this.ctx.canvas.clientHeight - this.bottom - (j - 1) * 50 -40);
}
},
horizontalbar:function(){
var width = this.categoryCount * this.dataCount * this.w1 + this.dataCount*this.marginX;
//绘制X轴
this.ctx.beginPath();
this.ctx.lineWidth = 1;
this.ctx.strokeStyle = "#999999";
this.ctx.moveTo(this.ox, this.ctx.canvas.clientHeight - this.bottom);
this.ctx.lineTo(this.ox+width+50, this.ctx.canvas.clientHeight - this.bottom);
this.ctx.stroke();
}
}
return myChart
})
demo:http://sandbox.runjs.cn/show/vwlqc81o
canvas 实现 柱状图的更多相关文章
- 第167天:canvas绘制柱状图
canvas绘制柱状图 1.HTML <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- js canvas画柱状图 没什么高端的 就是一篇偶尔思路的
公司项目要用js画柱状图,本来想用个插件吧 chart.js 忽然一想 我们也用不了那么大的插件.自己写个吧,也能看看自己那点数学水平能够不! 有几个小亮点吧 1.函数x 和 函数y 对坐标进行了转化 ...
- 小程序图表wx-chart
下载地址 https://github.com/xiaolin3303/wx-charts 使用步骤: 一.解压后,把dist里面的wxcharts.js或者wxcharts-min.js放在小程序的 ...
- 今天写动态canvas柱状图小结
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- d3.js多个x轴y轴canvas柱状图
最终效果图镇楼: 本文通过三个步骤来介绍d3.js. 1.简单的柱状图: 2.多个x轴的柱状图: 3.多个x轴.y轴的柱状图: 学习心得: d3.js入门相对比较困难,一旦掌握了核心思想,不断熟悉AP ...
- canvas图表详解系列(1):柱状图
本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种图表,详细分解步 ...
- canvas图表(1) - 柱状图
原文地址:canvas图表(1) - 柱状图 前几天用到了图表库,其中百度的ECharts,感觉做得最好,看它默认用的是canva,canvas图表在处理大数据方面比svg要好.那我也用canvas来 ...
- 【带着canvas去流浪】(1)绘制柱状图
目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 思考题 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端& ...
- canvas学习之柱状图
项目地址:http://pan.baidu.com/s/1nvhWrwP 因为最近项目中使用到了图表,而且个人一直希望研究canvas,所以最近几天花时间对canvas好好研究了一下,并写了一个dem ...
随机推荐
- Problem to create "New Database Diagram" in Microsoft SQL Server Management Studio for SQL Server 2012
Error: when click "New Database Diagram", a error popped up and said "Attempted to re ...
- iOS学习20之UIView
1. UI编程概述 UI的本意是用户界面,是英文 User 和 Interface 的缩写. UI设计则是指对软件的人机交互.操作逻辑.界面美观的整体设计. 好的UI设计不仅是让软件变得有个性有品位, ...
- Redis的两个小技巧
1.通配删除相同前缀的缓存 DEL命令的参数不支持通配符,但我们可以结合Linux的管道和xargs命令自己实现删除所有符合规则的键. 比如要删除所有以“structure_”开头的键,就可以执行下面 ...
- ACM 国王的魔镜
国王的魔镜 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的. 比如一 ...
- ACM: Billboard 解题报告-线段树
Billboard Time Limit:8000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descript ...
- 洛谷 P1160 队列安排 Label:链表 数据结构
题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为:老师 ...
- xenu工具介绍
Xenu Link Sleuth 也许是你所见过的最小但功能最强大的检查网站死链接的软件了.你可以打开一个本地网页文件来检查它的链接,也可以输入任何网址来检查.它可以分别列出网站 的活链接以及死链接, ...
- 【BZOJ】1119: [POI2009]SLO
题意 长度为\(n(1 \le n \le 1000000)\)的账单,\(+\)表示存1,\(-\)表示取1,任意时刻存款不会为负.初始有\(p\),最终有\(q\).每一次可以耗时\(x\)将某位 ...
- 【bzoj2049】[Sdoi2008]Cave 洞穴勘测 link-cut-tree
2016-05-30 11:04:51 学习了link-cut-tree 二中神犇封禹的讲义感觉讲的超级清晰易懂啊(没有的可以q窝 算是模板吧 #include<bits/stdc++.h&g ...
- Update UI from an asynchronous thread
One of the most common tasks you need to perform in a Windows Phone application is updating the UI f ...