zoukankan      html  css  js  c++  java
  • HTML5-canvas实例:2D折线数据图与2D扇形图

    基础知识:
    <canvas id="demo" width="400" height="400"></canvas>

    在页面上创建canvas标签,然后获取canvas这个元素,因为是画2D图,所以是调用.getContext('2d') 二维图方法

    var target = document.getElementById('demo'),
         pic = target.getContext('2d');

    canvas作图的平面空间,该空间的每个点都有自己的坐标,x表示横坐标,y表示竖坐标。原点(0, 0)位于图像左上角,x轴的正向是原点向右,y轴的正向是原点向下。

    部分API的介绍: 

      pic.beginPath(); //创建开始描绘路径(每一条线都需要重新创建一次,否则以后的操作【如填充颜色】都会反映在此路径)
        pic.moveTo(0, 0); //描绘的起点
        pic.lineTo(100,100); // 设置描绘线的终点,可以调用多次(以上次的终点为起点,继续描绘)
        pic.lineTo(240,340);
        pic.lineWidth = 1; //设置宽度
        pic.strokeStyle = '#259'; //设置颜色
        pic.stroke(); //填充
        pic.closePath(); //关闭此路径,可选

    封装:

      描绘路径必需知道起点坐标与终点坐标,因为可能是多次描绘,所以就需要用到二维数组把各个坐标保存下来,如[ [0,0],[100,50],[2,50] ],然后遍历二维数组,多次调用lineTo方法进行描绘。封装函数如下:

    // 画线 
        function drawContLine(opt){
            pic.beginPath();
            var path = opt.path,//[[0,0],[20,30]......]
                color = opt.color;
            pic.moveTo(path[0][0],path[0][1]);
            var n = 1,
                len = path.length;
            for(;n<len;n++){
                pic.lineTo(path[n][0],path[n][1]);
            }
            pic.lineWidth = 1;
            pic.strokeStyle = color;
            pic.stroke();
            pic.closePath();
        }

    例子:月份成绩分数对比曲线图

      

    完整代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"/>
        <title>Document</title>
        <style type="text/css">
        .ui-fill{border:1px solid #666;border-top:none;border-right:none;width:400px;height:400px;margin:50px auto;position:relative;}
        .scroe span{position:absolute;left:-40px;}
        .a10{top:-10px;}.a9{top:30px;}.a8{top:70px;}.a7{top:110px;}.a6{top:150px;}
        .a5{top:190px;}.a4{top:230px;}.a3{top:270px;}.a2{top:310px;}.a1{top:350px;}
        .year span{position:absolute;top:410px;white-space:nowrap;color:#700404;}
        .y1{left:70px;}.y2{left:150px;}.y3{left:230px;}.y4{left:310px;}.y5{left:390px;}
        </style>
    </head>
    <body>
        <div class="ui-fill">
            <canvas id="demo" width="400" height="400"></canvas>
            <div class="scroe">
                <span class="a1">10</span>
                <span class="a2">20</span>
                <span class="a3">30</span>
                <span class="a4">40</span>
                <span class="a5">50</span>
                <span class="a6">60</span>
                <span class="a7">70</span>
                <span class="a8">80</span>
                <span class="a9">90</span>
                <span class="a10">100</span>
            </div>
            <div class="year">
                <span class="y1">1月</span>
                <span class="y2">2月</span>
                <span class="y3">3月</span>
                <span class="y4">4月</span>
                <span class="y5">5月</span>
            </div>
        </div>
        <script type="text/javascript">
        var target = document.getElementById('demo');
        var pic = target.getContext('2d');
        //参数
        var sum = 400,
            ratio = 400/100;
        // 画线 
        function drawContLine(opt){
            pic.beginPath();
            var path = opt.path,//[[0,0],[20,30]......]
                color = opt.color;
            pic.moveTo(path[0][0],path[0][1]);
            var n = 1,
                len = path.length;
            for(;n<len;n++){
                pic.lineTo(path[n][0],path[n][1]);
            }
            pic.lineWidth = 1;
            pic.strokeStyle = color;
            pic.stroke();
            pic.closePath();
        }
        // 刻度线
        (function(){
            var scale = 20,
                i = sum/scale,
                n = 0;
            for(;n<i;n++){
                drawContLine({'path':[[scale*n*4,0],[scale*n*4,sum]],'color':'#f4f4f4'});
                drawContLine({'path':[[0,scale*n],[sum,scale*n]],'color':'#f4f4f4'});                        
            }
        })();
        // 分数转化为坐标输出
        function transforCoor(opt){
            var scroes = opt.scroes,
                scale = 20*4,
                n = 0,
                len = scroes.length,
                a_path = [];
            for(;n<len;n++){
                var x = sum - scroes[n]*ratio;
                var arry = [scale*(n+1),x];
                //console.log(arry);
                a_path.push(arry);
            }
    
            drawContLine({'path':a_path,'color':opt.color});
        }
        transforCoor({'scroes':[90,80,98,70,60],'color':'#259'});
        transforCoor({'scroes':[88,86,85,84,85],'color':'#f60'});
        </script>
    </body>
    </html>

     扇形图:

    ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);

      arc方法的x和y参数是圆心坐标,radius是半径,startAngle和endAngle则是扇形的起始角度和终止角度(以弧度表示,Math.PI*2表示360度),anticlockwise表示做图时应该逆时针画(true)还是顺时针画(false)

      例子:

      <canvas id="j_canvas" width="300" height="300"></canvas>
        <script type="text/javascript">
        /*
        * @param {obj}
        * @param {string} id canvas的id
        * @param {array} colors 颜色
        * @param {array} pers 占的比值(小数格式)
        */
        function drawSector(opt){
            var target = document.getElementById(opt.id),
                ctx = target.getContext('2d'),
                colors = opt.colors,
                pers = opt.pers,
                n = 0,
                len = colors.length,
                w = target.getAttribute('width'),
                v = 0,
                s = 0,
                e  = 0;
            for(;n<len;n++){
                ctx.beginPath(); 
                    v = n==0?0:Number(pers[n-1]),
                    s = s + v,
                    e =  e + Number(pers[n]);
                ctx.arc(w/2, w/2, w/2, Math.PI*2*s, Math.PI*2*e,false); 
                //画出结束半径
                ctx.lineTo(w/2,w/2);
                ctx.fillStyle = colors[n]; 
                ctx.fill();
            }
        }
        drawSector({'id':'j_canvas','colors':['#259','#333','#f60','#999'],'pers':['0.2','0.4','0.3','0.1']});
    </script>
  • 相关阅读:
    用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
    jenkins持续集成:jenkins+SVN
    Linux基础一:Linux的安装及相关配置
    jenkins持续集成:构建多个job同时执行
    jenkins持续集成:定时构建语法
    Nginx详解二十九:基于Nginx的中间件架构设计
    Nginx详解二十八:Nginx架构篇Nginx+Lua的安全waf防火墙
    Nginx详解二十七:Nginx架构篇之安全篇
    Nginx详解二十六:Nginx架构篇之性能优化
    Nginx详解二十五:Nginx架构篇之Nginx常见的问题
  • 原文地址:https://www.cnblogs.com/focuslgy/p/4174026.html
Copyright © 2011-2022 走看看