博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
html5实现饼图和线图-我们到底能走多远系列(34)
阅读量:5973 次
发布时间:2019-06-19

本文共 7021 字,大约阅读时间需要 23 分钟。

我们到底能走多远系列(34)

扯淡:

  送给各位一段话:

    人生是一个不断做加法的过程
    从赤条条无牵无挂的来
    到学会荣辱羞耻 礼仪规范
    再到赚取世间的名声 财富 地位
    但是人生还要学会做减法
    财富名声这些身外之物有一天会失去
    朋友 亲人终有一天会离你而去
    我们自己会衰老 迟钝
    最后赤条条的离开这个世界
    我们都不太擅长做人生的减法
    很难学会放下
    放不下面子 所以要打肿脸充胖子
    放不下逝去的情感 就会沉溺其中 痛苦不堪
    放不下输赢 所以总是如履薄冰 心惊胆战
    佛说 我执 是痛苦的根源
    人生要学会 断 舍 离
    断绝不需要的东西
    舍弃多余的废物
    脱离对物品的执念
    所以想幸福 请先放下
 
 
主题:
 
  最近想用html5来话图表,就接触了下,发现html5 是一个总称而已,进去后里面分成各种标签比如:HTML5
Video,HTML5
Audio,HTML5
Canvas等等,各不相关,所以学习起来也不复杂,比如我想画图表就先学习下
Canvas就好了。
  
  所以,我感觉这东西也就是调下api,没什么太大的难度,难得地方是要实现一个东西还需要学习css,javascript这些东西才行。
  
  自己画的线图:
用一个function包起来,是为了简单的封装一下内部的变量。
  
  需要注意的是代码依赖jquery。
  
  这是一个比较初步的实现,对于canvas上画图,其实直接理解成现实中那笔在话就可以了,像下面的线图,先画好x y 轴,然后再话线,再来画事件现实文字。画面变化的产生目前我发现的是用clearRect方法先清空画面,然后重画....
 
function lineChart(data){    var xPadding = 60;//x轴离边框的距离    var yPadding = 50;//y轴离边框的距离    var canvasWidth;    var canvasHeight;    var xAxisLength; //x轴长度    var yAxisLength; //y轴长度    var xTextColour = "#000000";   // x轴字体颜色    var yTextColour = "#000000";  // y轴字体颜色    var dotsColour = "#183487";  // 图标点的颜色    var lineWidth = 2 //线宽度    var lineColour = "#194E9C";  // 线颜色    var lineShadowColour = "rgba( 0, 0, 0, .5 )"; // 线阴影颜色    var lineShadowBlur = 15;    var lineShadowOffsetX = 3;    var lineShadowOffsetY = 3;    var xyColour = "#4B0082";   //xy轴颜色    var xToTextlength = 20; //x轴和文字的间距    var yToTextlength = 10; //y轴和文字的间距    var yTextNum = 6;  //y轴和文字数量    var chartLineFont = "bold 16px 'Trebuchet MS', Verdana, sans-serif";// xy轴字体    var chooseDotTextFont = "bold 16px 'Trebuchet MS', Verdana, sans-serif";//显示提示字体    var dotsToDotsXLength; //x轴间距    var dotsXArray = [];    var divideXArray = [];  //分割每个点的竖切线的x坐标    var lineChart;                       // The canvas element in the page    init(data);    function init(data){        lineChart =  document.getElementById('lineChart');        // Initialise some properties of the canvas and chart        canvasWidth = lineChart.width;        canvasHeight = lineChart.height;        xAxisLength = canvasWidth - 2*xPadding;        yAxisLength = canvasHeight - 2*yPadding;        dotsToDotsXLength = xAxisLength / data.length;        drawLineChart();        // 添加事件        $('#lineChart').mousemove(handleDotsMousemoveEvent);    }    function drawLineChart(index){        var c = lineChart.getContext('2d');        // Clear the canvas, ready for the new frame        c.clearRect ( 0, 0, canvasWidth, canvasHeight );                c.lineWidth = lineWidth;        c.strokeStyle = xyColour;                // Draw the axises        c.beginPath();        c.moveTo(xPadding, yPadding);        // y轴        c.lineTo(xPadding, lineChart.height - yPadding);        // x轴        c.lineTo(lineChart.width - yPadding, lineChart.height - yPadding);        c.stroke();                // Draw the the background line        c.beginPath();        c.strokeStyle = '#D9D6D6';        for(var i = 0; i <= getMaxYPoint(getMaxY()); i += getYSpace()) {            if(i != 0){                c.moveTo(xPadding + 2, getYPixel(i));                c.lineTo(xPadding + xAxisLength + 2, getYPixel(i));            }        }        c.stroke();                // Draw the X value texts        c.font = chartLineFont;        c.fillStyle = xTextColour;        c.textAlign = "center";        var step = parseInt(data.length/yTextNum);        for(var i = 0; i < data.length; i =i + step) {            c.fillText(data[i].X, getXPixel(i), lineChart.height - yPadding + xToTextlength);        }                // Draw the Y value texts        c.textAlign = "right";        c.textBaseline = "middle";        c.fillStyle = yTextColour;        for(var i = 0; i <= getMaxYPoint(getMaxY()); i += getYSpace()) {            c.fillText(formatNum(i), xPadding - yToTextlength, getYPixel(i));        }                // Draw the line graph        drawLineAndDots(c, index);    }    /**     * 画线     * @param c     * @param index     */    function drawLineAndDots(c, index){        c.beginPath();        c.strokeStyle = lineColour;        c.moveTo(getXPixel(0), getYPixel(data[0].value));        for(var i = 1; i < data.length; i ++) {            // 使用直线            //c.lineTo(getXPixel(i), getYPixel(data[i].value));            //var cps = getControlPoints(getXPixel(i-1),getYPixel(data[i-1].value),getXPixel(i),getYPixel(data[i].value));            //为了更美观一点 使用了弯曲的线             c.bezierCurveTo(getXPixel(i-1)+9,getYPixel(data[i-1].value)+9,getXPixel(i)-9,getYPixel(data[i].value)-9,getXPixel(i), getYPixel(data[i].value))                        /**            // 线的阴影部分            c.shadowBlur = lineShadowBlur;            c.shadowOffsetX = lineShadowOffsetX;            c.shadowOffsetY = lineShadowOffsetY;            c.shadowColor = lineShadowColour;            **/                    }        c.stroke();        c.shadowColor = "rgba( 0, 0, 0, 0 )";        c.closePath();        // Draw the dots        c.fillStyle = dotsColour;        for(var i = 0; i < data.length; i ++) {            // 有点中的节点            if(i == index){                c.beginPath();                c.arc(getXPixel(i), getYPixel(data[i].value), 8, 0, Math.PI * 2, true);                c.fill();                c.textAlign = "center";                c.font = chooseDotTextFont;                c.fillText(data[i].X, xAxisLength + xPadding + 5 , 20 )                c.fillText(data[i].value, xAxisLength + xPadding + 5 , 40 )            }else{                c.beginPath();                c.arc(getXPixel(i), getYPixel(data[i].value), 4, 0, Math.PI * 2, true);                c.fill();            }            divideXArray[i] = getXPixel(i) + dotsToDotsXLength/2;        }    }    function getMaxY() {        var max = 0;        for(var i = 0; i < data.length; i ++) {            if(data[i].value > max) {                max = data[i].value;            }        }        max += 10 - max % 10;        return max;    }    /**     * 计算x轴间距     * @param val     * @returns {number}     */    function getXPixel(val) {        return (dotsToDotsXLength) * val + (xPadding * 1.5);    }    /**     * 计算y轴间距     * @param val     * @returns {number}     */    function getYPixel(val) {        return lineChart.height - ((yAxisLength / getMaxYPoint(getMaxY())) * val) - yPadding;    }    /**     * 计算Y轴显示最大值     * 输入1234 输出2000     * @param maxY     */    function getMaxYPoint(maxY){        var firstDigit  =  parseInt((maxY + '').substring(0,1)) + 1;        var digitNum =  parseInt((maxY+"").length);        for(var i = 1; i
效果:

 

 
 
 
 
 
饼图:
这个代码是来自于网上:
里面有详细的解释。
注意以上网站上的源码无法直接使用所以 本人进行了部分的修改,以实现能够动态的处理后台传输的数据,并增加一个栏目,使功能完整。可以直接作为插件放入项目。
 

修改后的代码:(直接保存html文件即可)

 

Pie Chart with HTML5 and jQuery - 1.0
Widget Sales ($) prcent (%)
View Code

 

 

 

总结:

 
1,我们完全可以只利用API画出自己想要的东西
 
2,关于html5图表的插件有很多比如:
3,阅读网站:http://diveintohtml5.info/
 
4,不管html5以后发不发展,学点然后做个比较复杂的动画玩玩,也不错
 
 
 补充:
  鉴于项目压力,为了竟可能满足需求,可能最终我们不得不选择网上更加成熟的框架,但无论如何,本人还是希望能够完善出一个比较好的图表框架出来。
 
 
 

让我们继续前行

----------------------------------------------------------------------

努力不一定成功,但不努力肯定不会成功。

共勉。

转载地址:http://trfox.baihongyu.com/

你可能感兴趣的文章
Shell之Sed常用用法
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
mysql开启binlog
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>
并查集hdu1232
查看>>
Mysql 监视工具
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
博客搬家了
查看>>
Python中使用ElementTree解析xml
查看>>
jquery 操作iframe、frameset
查看>>
解决vim中不能使用小键盘
查看>>
Eclipse Java @Override 报错
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
mysql多实例实例化数据库
查看>>
javascript 操作DOM元素样式
查看>>
HBase 笔记3
查看>>
【Linux】Linux 在线安装yum
查看>>
Atom 编辑器系列视频课程
查看>>
[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
查看>>