(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 画图表的更多相关文章

  1. 怎样用JavaScript和HTML5 Canvas绘制图表

    原文:https://code.tutsplus.com/zh-...原作:John Negoita翻译:Stypstive 在这篇教程中,我将展示用JavaScript和canvas作为手段,在饼状 ...

  2. HTML5 Canvas 画虚线组件

    前段时间由于项目需要,用到了HTML5 Canvas画图,但是没有画虚线的方法,自己写了一个HTML5 画虚线的组件. dashedLine.js if (window.CanvasRendering ...

  3. HTML5 Canvas 画钟表

    画钟表是2D画图的老生常谈,我也不能免俗弄了一个.代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta ht ...

  4. CSS3进度条 和 HTML5 Canvas画圆环

    看到一些高大上的进度条插件,然后想自己用CSS写.经过搜索资料之后,终于成功了.为了以后方便拿来用,或者复习.将代码贴出. HTML代码: 只需要两个div,外面的为一个有border的div id为 ...

  5. html5 canvas画饼

    1. [图片] lxdpie.jpg ​2. [文件] lqdpie.html ~ 801B     下载(7) <!DOCTYPE HTML PUBLIC "-//W3C//DTD ...

  6. html5 canvas画不出图像的原因

    很久没写博客了,今年过年的时候,家里出了意外,现在心里依然很难受.6月份之前一直忙着写毕业论文,答辩完6月初回公司继续上班,今天刚好周末有空,就写下之前碰到一个问题. 做一个图像查看器(基于Chrom ...

  7. html5 canvas画流程图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. HTML5 Canvas画数字时钟

    先不说废话,没代码算个蛋. 一些地方注释都写得比较清楚,不过这只是部分,因为只有秒针,但是时针,分针的逻辑都是一致的. 代码中有些坐标不知道为什么较不准,看看就好

  9. html5 canvas画进度条

    这个ie8的兼容是个问题,ie8 的innerHTML有问题啊,添加两个附件吧 <!DOCTYPE html> <html> <head> <meta cha ...

随机推荐

  1. Ring0打开其他设备对象三种方式整理

    1.通过ZwCreateFile打开其他设备的Handle,此函数只能得到句柄.ZwCreateFile与NtCreateFile区别在于NtCreateFile更加底层,ZwCreateFile是基 ...

  2. 对session的理解

    java Servlet API引入session 机制来跟踪客户的状态,session指的是在一段时间内,单个客户和web服务器之间一连串的交互过程,在一个session中,一个客户可能会多次请求同 ...

  3. 安装 Linux 时碰到的硬盘分区的陷阱及应对

    硬盘分区的陷阱及应对 之所以想到写这篇,是因为本人在折腾 Linux 系统的过程中,有多次掉入硬盘分区的陷阱的经历.最近几天,再一次掉入坑中,折腾了两天才从坑中爬出来.经过多方查询资料,终于弄明白了硬 ...

  4. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析

    前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...

  5. Mysql 主从延时监控

    200 ? "200px" : this.width)!important;} --> 介绍 主从延时在主从环境中是一个非常值得关注的问题,有时候我们可以通过show sla ...

  6. Zookeeper API for JAVA实战与应用

    package com.zookeeper.watcher; import java.util.List; import java.util.concurrent.CountDownLatch; im ...

  7. Jmeter 使用Jmeter与Badboy进行压力测试

    1. 介绍 Badboy是一个录制请求的工具,这里用它来生成文件给JMeter用. JMeter是一个用java写的开源的性能测试工具,用于模拟在服务器.网络或者其他对象上附加高负载以测试他们提供服务 ...

  8. java.io中的System.in、 System.out和System.err

    System.in, System.out, System.err这3个流同样是常见的数据来源和数据流目的地.使用最多的可能是在控制台程序里利用System.out将输出打印到控制台上. JVM启动的 ...

  9. LINQ系列:Linq to Object分组操作符

    分组是指根据一个特定的值将序列中的值或元素进行分组.LINQ只包含一个分组操作符:GroupBy. GroupBy 1>. 原型定义 public static IQueryable<IG ...

  10. ELF文件

    ELF文件格式是一个开发标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型: 可重定位的目标文件 可执行文件 共享库 现在分析一下上一篇文章中经过汇编之后生成的目标文件max.o和 ...