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 ...
 
随机推荐
- Linux tar文件打包
			
tar格式,会打包成一个文件,可以对多个目录,或者多个文件进行打包 tar命令只是打包,不会压缩,打包前后大小是一样的 tar命令 -c //打包 -x //解压 -f //指定文件 ...
 - window.location事件
			
一.最外层top跳转页面,适合用于iframe框架集 top.window.location.href("${pageContext.request.contextPath}/Login_g ...
 - ios 定位
			
ios 定位新功能----在程序中实现定位功能 Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如 ...
 - DotNet Core 介绍
			
前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...
 - ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”
			
在Linux上运行ASP.NET网站或WebApi的传统步骤是,先安装libgdiplus,再安装mono,然后安装Jexus.在这个过程中,虽然安装Jexus是挺简便的一件事,但是安装mono就相对 ...
 - [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
			
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
 - [译]Asp.net MVC 之 Contorllers(一)
			
Asp.net MVC contorllers 在Ajax全面开花的时代,ASP.NET Web Forms 开始慢慢变得落后.有人说,Ajax已经给了Asp.net致命一击.Ajax使越来越多的控制 ...
 - 如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?
			
理想的RESTful Web API采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环 ...
 - 学习RBAC 用户·角色·权限·表
 - SQL中Group By的使用
			
1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...