html5 canvas 画图表
(function () {
var canvas = document.createElement("canvas");
canvas.width = 800;
canvas.height = 400;
canvas.innerText = "抱歉,你的浏览器不支持canvas T_T";
document.getElementById('leoncanvas').appendChild(canvas);
var data = { "aaa": 1000, "bbb": 600, "ccc": 200, "ddd": 400, "eee": 550, "fff": 50, "ggg": 10, "hhh": 280 };
var yAxisValueStep = 100;
var width = canvas.width;
var height = canvas.height;
// data length calc & value analysis
var length = 0, min = 0, max = 0;
for (var i in data) {
length++;
if (data[i] < min)
min = data[i];
if (data[i] > max)
max = data[i];
}
var xLength = width * 0.9;
var yLength = height * 0.7;
var left = width * 0.12;
var bottom = height * 0.08;
// origin point
var x0 = left;
var y0 = height - bottom;
var p0 = { x: x0, y: y0 };
var px = { x: left + xLength, y: p0.y };
var py = { x: p0.x, y: p0.y - yLength };
var xScaleMarkWidth = xLength / (length + 3);
var yScaleMarkWidth = yLength / (length + 3);
// begin to draw axis
var context = canvas.getContext('2d');
context.beginPath();
// offset 0.5 to draw 1 pixel line
//http://kilianvalkhof.com/2010/design/the-problem-with-svg-and-canvas/
// xAxis
context.moveTo(p0.x + 0.5, p0.y + 0.5);
context.lineTo(px.x + 0.5, px.y + 0.5);
// yAxis
context.moveTo(p0.x + 0.5, p0.y + 0.5);
context.lineTo(py.x + 0.5, py.y + 0.5);
context.font = "normal lighter 12px sans-serif";
// scale marker
for (var i = 0; i < length + 2; i++) {
// xaxis
context.moveTo(p0.x + (i + 1) * xScaleMarkWidth + 0.5, p0.y + 0.5);
context.lineTo(p0.x + (i + 1) * xScaleMarkWidth + 0.5, p0.y + 2 + 0.5);
// yaxis
context.moveTo(p0.x + 0.5, p0.y - (i + 1) * yScaleMarkWidth + 0.5);
context.lineTo(p0.x + 0.5 - 2, p0.y - (i + 1) * yScaleMarkWidth + 0.5);
}
// y axis marker value
for (var i = 0; i <= length + 2; i++) {
// yaxis value
context.fillText(yAxisValueStep * i, p0.x + 0.5 - 30, p0.y - i * yScaleMarkWidth + 3);
}
// draw column chart
var lengthPerValue = (yScaleMarkWidth * (length + 2)) / max;
var rectX, rectY;
var i = 0;
for (var p in data) {
rectX = p0.x + (i + 1) * xScaleMarkWidth + 0.5 - xScaleMarkWidth * 0.25;
rectY = p0.y - lengthPerValue * data[p];
// draw column
context.fillStyle = "rgba(255,0,0,0.6)";
context.fillRect(rectX, rectY, xScaleMarkWidth / 2, lengthPerValue * data[p]);
// add text
context.fillStyle = 'rgb(0,0,0)';
// column value
context.fillText(data[p], rectX, rectY - 15);
// x value
context.fillText(p, rectX + xScaleMarkWidth * 0.1, rectY + lengthPerValue * data[p] + 20);
i++;
}
context.lineWidth = 1;
context.stroke();
context.closePath();
})();
柱状图效果如下:
(function () {
var canvas = document.createElement("canvas");
canvas.width = 800;
canvas.height = 400;
canvas.innerText = "抱歉,你的浏览器不支持canvas T_T";
document.getElementById('leoncanvas1').appendChild(canvas);
var data = { "aaa": 1000, "bbb": 600, "ccc": 200, "ddd": 400, "eee": 550, "fff": 50, "ggg": 10, "hhh": 280 };
var yAxisValueStep = 100;
var width = canvas.width;
var height = canvas.height;
// data length calc & value analysis
var length = 0, min = 0, max = 0;
for (var i in data) {
length++;
if (data[i] < min)
min = data[i];
if (data[i] > max)
max = data[i];
}
var xLength = width * 0.9;
var yLength = height * 0.7;
var left = width * 0.12;
var bottom = height * 0.08;
// origin point
var x0 = left;
var y0 = height - bottom;
var p0 = { x: x0, y: y0 };
var px = { x: left + xLength, y: p0.y };
var py = { x: p0.x, y: p0.y - yLength };
var xScaleMarkWidth = xLength / (length + 3);
var yScaleMarkWidth = yLength / (length + 3);
// begin to draw axis
var context = canvas.getContext('2d');
context.beginPath();
// offset 0.5 to draw 1 pixel line
//http://kilianvalkhof.com/2010/design/the-problem-with-svg-and-canvas/
// xAxis
context.moveTo(p0.x + 0.5, p0.y + 0.5);
context.lineTo(px.x + 0.5, px.y + 0.5);
// yAxis
context.moveTo(p0.x + 0.5, p0.y + 0.5);
context.lineTo(py.x + 0.5, py.y + 0.5);
// scale marker
for (var i = 0; i < length + 2; i++) {
// xaxis
context.moveTo(p0.x + (i + 1) * xScaleMarkWidth + 0.5, p0.y + 0.5);
context.lineTo(p0.x + (i + 1) * xScaleMarkWidth + 0.5, p0.y + 2 + 0.5);
// yaxis
context.moveTo(p0.x + 0.5, p0.y - (i + 1) * yScaleMarkWidth + 0.5);
context.lineTo(p0.x + 0.5 - 2, p0.y - (i + 1) * yScaleMarkWidth + 0.5);
}
// y axis marker value
for (var i = 0; i <= length + 2; i++) {
// yaxis value
context.fillText(yAxisValueStep * i, p0.x + 0.5 - 30, p0.y - i * yScaleMarkWidth + 3);
}
// draw column chart
var lengthPerValue = (yScaleMarkWidth * (length + 2)) / max;
//var rectX, rectY;
var x, y;
var i = 0;
context.font = "normal lighter 12px sans-serif";
// set axis text & marker
for (var p in data) {
x = p0.x + (i + 1) * xScaleMarkWidth + 0.5;
y = p0.y - lengthPerValue * data[p];
// add text
context.fillStyle = 'rgb(0,0,0)';
// point value
context.fillText(data[p], x, y - 15);
// x value
context.fillText(p, x + xScaleMarkWidth * 0.1, y + lengthPerValue * data[p] + 20);
i++;
}
context.stroke();
context.closePath();
context.beginPath();
context.strokeStyle = "rgba(255,0,0,0.8)";
context.lineCap = "square";
context.lineJoin = "miter";
context.lineWidth = 2;
i = 0;
for (var p in data) {
x = p0.x + (i + 1) * xScaleMarkWidth + 0.5;
y = p0.y - lengthPerValue * data[p];
if (i == 0) {
context.moveTo(x, y);
}
else {
context.lineTo(x, y);
}
i++;
}
context.stroke();
context.closePath();
})();
折线图效果如下:
html5 canvas 画图表的更多相关文章
- 怎样用JavaScript和HTML5 Canvas绘制图表
原文:https://code.tutsplus.com/zh-...原作:John Negoita翻译:Stypstive 在这篇教程中,我将展示用JavaScript和canvas作为手段,在饼状 ...
- HTML5 Canvas 画虚线组件
前段时间由于项目需要,用到了HTML5 Canvas画图,但是没有画虚线的方法,自己写了一个HTML5 画虚线的组件. dashedLine.js if (window.CanvasRendering ...
- HTML5 Canvas 画钟表
画钟表是2D画图的老生常谈,我也不能免俗弄了一个.代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta ht ...
- CSS3进度条 和 HTML5 Canvas画圆环
看到一些高大上的进度条插件,然后想自己用CSS写.经过搜索资料之后,终于成功了.为了以后方便拿来用,或者复习.将代码贴出. HTML代码: 只需要两个div,外面的为一个有border的div id为 ...
- html5 canvas画饼
1. [图片] lxdpie.jpg 2. [文件] lqdpie.html ~ 801B 下载(7) <!DOCTYPE HTML PUBLIC "-//W3C//DTD ...
- html5 canvas画不出图像的原因
很久没写博客了,今年过年的时候,家里出了意外,现在心里依然很难受.6月份之前一直忙着写毕业论文,答辩完6月初回公司继续上班,今天刚好周末有空,就写下之前碰到一个问题. 做一个图像查看器(基于Chrom ...
- html5 canvas画流程图
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- HTML5 Canvas画数字时钟
先不说废话,没代码算个蛋. 一些地方注释都写得比较清楚,不过这只是部分,因为只有秒针,但是时针,分针的逻辑都是一致的. 代码中有些坐标不知道为什么较不准,看看就好
- html5 canvas画进度条
这个ie8的兼容是个问题,ie8 的innerHTML有问题啊,添加两个附件吧 <!DOCTYPE html> <html> <head> <meta cha ...
随机推荐
- 浏览器调试js技巧总结
一.控制台console的运用 console.log(aa|'aa'): 将需要打印的东西输出的控制台,在调试的时候很有用,可以知道aa是否是自己想要的数据类型,或者可以知道程序是否执行到了这一步, ...
- error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
zabbix3.2启动有如下报错: # service zabbix_server startStarting zabbix_server: /home/zabbix-server/sbin/zab ...
- IOS第一天-新浪微博 - 框架的搭建
*************HWAppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWith ...
- 基于 Asp.Net的 Comet 技术解析
Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的说是一种基于现 ...
- TaintDroid剖析之Native方法级污点跟踪分析
1.Native方法的污点传播 在前两篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪的.现在我们继续分析其第二个粒度的污点跟踪—— ...
- [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧
不知不觉又半个月没有更新博客了,今天终于抽出点时间,来分享一下前段时间的成果. 在网上,我们经常看到各种各样的图片,尤其是GIF图片的动态效果,让整个网站更加富有表现力!有时候,我们看到一些比较好看的 ...
- SSRS(rdl报表)分页显示表头和对表头的冻结处理
基础环境 最近在公司做西门子某系统的二次开发,需要用到SQLServer Reporting Services(SSRS).我们用的SQL版本是SQLServer 2008 R2:在设计报表时,表格用 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...
- iOS----集成ijkplayer视频直播
ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...