zoukankan      html  css  js  c++  java
  • Canvas 画折线图

    一、画折线图需要有如下准备如下:

      1、绘制网格

      2、绘制坐标系

      3、绘制点

      4、点连线就成了折线图

    二、绘制网格

      1、确认网格(每个格子)的大小

      2、确认X轴方向有多少条横线

      3、确认Y轴方向有多少条竖线

      4、遍历画出来

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <style>
              canvas{
                border: 1px solid #ccc;
              }
            </style>
        </head>
        <body>
          <canvas width="600" height="400"></canvas>
          <script>
          var myCanvas = document.querySelector("canvas");
          var ctx = myCanvas.getContext("2d");
    
          // 确认网格的大小
          var grid = 10;
          // x轴方向画多少条横线
          var canvasHeight = ctx.canvas.height;
          var xLineTotal = Math.floor(canvasHeight / grid);
          // y轴方向画多少条竖线
          var canvasWidth = ctx.canvas.width;
          var yLineTotal = Math.floor(canvasWidth / grid);
          // 遍历
            // 遍历横线
          for(var i = 0; i <= xLineTotal; i++){
            ctx.beginPath();
            ctx.moveTo(0, i * grid - 0.5);
            ctx.lineTo(canvasWidth, i * grid -0.5);
            ctx.strokeStyle = "#ddd";
            ctx.stroke();
          }
            // 遍历竖线
          for(var i = 0; i <= yLineTotal; i++){
            ctx.beginPath();
            ctx.moveTo(i * grid, 0 - 0.5);
            ctx.lineTo(i * grid, canvasHeight - 0.5);
            ctx.strokeStyle = "#ddd";
            ctx.stroke();
          }
          
    
          </script>
        </body>
    </html>
    

      

     三、坐标系

      1、确定原点位置

      2、确定两边的边距

      3、确定箭头的长度,绘制等腰三角形

      

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <style>
              canvas{
                border: 1px solid #ccc;
              }
            </style>
        </head>
        <body>
          <canvas width="600" height="400"></canvas>
          <script>
          var myCanvas = document.querySelector("canvas");
          var ctx = myCanvas.getContext("2d");
    
          var canvasHeight = ctx.canvas.height;
          var canvasWidth = ctx.canvas.width;
          // 1、确认边距,和箭头大小
          // 边距
          var space = 20;
          // 箭头长
          var arrowSize = 10;
    
          // 2、确定坐标原点
          
          var x0 = space ;
          var y0 = canvasHeight - space;
          // 3、画出X轴和箭头
          ctx.beginPath();
          ctx.moveTo(x0, y0);
          ctx.lineTo(canvasWidth - space, y0);
          ctx.lineTo(canvasWidth - space - arrowSize, y0 + arrowSize / 2);
          ctx.lineTo(canvasWidth - space - arrowSize, y0 - arrowSize / 2);
          ctx.lineTo(canvasWidth - space, y0);
          ctx.fill();
          ctx.strokeStyle = "#000";
          ctx.stroke();
    
          // 4、画出Y轴和箭头
          ctx.beginPath();
          ctx.moveTo(x0, y0); 
          ctx.lineTo(space, space);
          ctx.lineTo(space - arrowSize / 2, space + arrowSize);
          ctx.lineTo(space + arrowSize / 2, space + arrowSize);
          ctx.lineTo(space, space);
          ctx.fill();
          ctx.strokeStyle = "#000";
          ctx.stroke();
    
          </script>
        </body>
    </html>    
    

      

    四、绘制点

     1、确定点的尺寸

     2、以坐标中心绘制点

         var Disc = function(x, y){
            this.x = x;
            this.y = y;
          }
          var dicsAside = 6;
          var dics1 = new Disc(100, 100);
          ctx.beginPath();
          ctx.moveTo(dics1.x - dicsAside / 2, dics1.y - dicsAside / 2);
          ctx.lineTo(dics1.x + dicsAside / 2, dics1.y - dicsAside / 2);
          ctx.lineTo(dics1.x + dicsAside / 2, dics1.y + dicsAside / 2);
          ctx.lineTo(dics1.x - dicsAside / 2, dics1.y + dicsAside / 2);
          ctx.closePath();
          ctx.fill();
    

    五、绘制折线图

     注:网格,坐标系,点都能绘制出来了,下面就可以开始绘制折线图了

      

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <style>
              canvas{
                border: 1px solid #333;
              }
    
            </style>
        </head>
        <body>
          <canvas id="my_canvas" width="600" height="400"></canvas>
          <script>
          var LineChart = function(canvas){
            // 获取canvas
            this.canvas = document.querySelector("canvas");
            // 获取上下文
            this.ctx = this.canvas.getContext("2d");
            // 获取画布的高
            this.canvasHeight = this.ctx.canvas.height;
            // 获取画布的宽
            this.canvasWidth = this.ctx.canvas.width;
            // 设置网格格子的大小
            this.gridSize = 10;
            // 设置坐标系边距
            this.space = 20;
            // 设置箭头的长
            this.arrowSize = 10;
            // 设置点的大小
            this.dottedSize = 6;
    
    
          }
          LineChart.prototype.init = function(data){
            this.drawGrid(this.ctx, this.canvasHeight, this.canvasWidth, this.gridSize);
            this.drawCoord(this.ctx, this.space, this.arrowSize, this.canvasHeight, this.canvasWidth);
            this.drawDotted(data, this.ctx, this.canvasHeight, this.space, this.dottedSize);
          }
          // 绘制网格
          LineChart.prototype.drawGrid = function(ctx,canvasHeight, canvasWidth, gridSize){
            var xLineTotal = Math.floor(canvasHeight / gridSize);
            var yLineTotal = Math.floor(canvasWidth / gridSize);
            // 绘制横线
            for(var i = 0; i < xLineTotal; i++){
              ctx.beginPath();
              ctx.moveTo(0, i * gridSize - .5);
              ctx.lineTo(canvasWidth, i * gridSize - .5);
              ctx.strokeStyle = "#ddd";
              ctx.stroke();
            }
            // 绘制竖线
            for(var i = 0; i < yLineTotal; i++){
              ctx.beginPath();
              ctx.moveTo(i * gridSize - .5, 0 );
              ctx.lineTo(i * gridSize - .5, canvasHeight);
              ctx.strokeStyle = "#ddd";
              ctx.stroke();
            }
          }
          //绘制坐标系
          LineChart.prototype.drawCoord = function(ctx, space, arrowSize, canvasHeight, canvasWidth){
            var x0 = space;
            var y0 = canvasHeight - space;
            // 绘制X轴
            ctx.beginPath();
            ctx.moveTo(x0, y0);
            ctx.lineTo(canvasWidth - space, y0);
            ctx.strokeStyle = "#000";
            ctx.stroke();
            ctx.lineTo(canvasWidth - space - arrowSize, y0 + arrowSize / 2);
            ctx.lineTo(canvasWidth - space - arrowSize, y0 - arrowSize / 2);
            ctx.lineTo(canvasWidth - space, y0);
            ctx.fill();
    
            // 绘制Y轴
            ctx.beginPath();
            ctx.moveTo(x0, y0);
            ctx.lineTo(space, space);
            ctx.strokeStyle = "#000";
            ctx.stroke();
            ctx.lineTo(space + arrowSize / 2, space + arrowSize);
            ctx.lineTo(space - arrowSize / 2, space + arrowSize);
            ctx.lineTo(space, space);
            ctx.fill();
          }
          // 绘制点并连线
          LineChart.prototype.drawDotted = function(data,ctx,canvasHeight,space,dottedSize){
            var x0 = space;
            var y0 = canvasHeight - space ;
            var prevCanvasX = 0;
            var prevCanvasY = 0;
            data.forEach(function(item,i){
              var canvasX = x0 + item.x;
              var canvasY = y0 - item.y;
              ctx.beginPath();
              ctx.moveTo(canvasX - dottedSize / 2, canvasY - dottedSize / 2);
              ctx.lineTo(canvasX + dottedSize / 2, canvasY - dottedSize / 2);
              ctx.lineTo(canvasX + dottedSize / 2, canvasY + dottedSize / 2);
              ctx.lineTo(canvasX - dottedSize / 2, canvasY + dottedSize / 2);
              ctx.closePath();
              ctx.fill();
    
              ctx.beginPath();
              if(i == 0){
                ctx.moveTo(x0, y0);
                ctx.lineTo(canvasX, canvasY);
                ctx.stroke();
              }else{
                // ctx.moveTo(x0+data[i-1].x, y0 - data[i-1].y);
                ctx.moveTo(prevCanvasX, prevCanvasY);
                ctx.lineTo(canvasX, canvasY);
                ctx.stroke();
              }
              prevCanvasX = canvasX;
              prevCanvasY = canvasY;
            });
    
    
          }
    
          var data = [
            {
              x : 100,
              y : 100
            },
            {
              x : 200,
              y : 85
            },
            {
              x : 300,
              y : 125
            },
            {
              x : 400,
              y : 200,
            },
            {
              x : 500,
              y : 330
            }
    
          ];
    
          var lineChart = new LineChart("my_canvas");
          lineChart.init(data);
          </script>
        </body>
    </html>
    

      

  • 相关阅读:
    CentOS 7 和centos6切换图形界面和多用户界面
    centos6.8下安装elasticsearch
    一个xib钟多个Cell
    iOS frame从导航栏下面开始
    Xcode 移除(卸载)插件
    iOS9 HTTP传输安全
    pch头文件
    真机调试---打包6plus出现问题
    Xcode 添加类前缀
    iOS 状态栏黑色背景白色字体
  • 原文地址:https://www.cnblogs.com/hxblogs/p/13259059.html
Copyright © 2011-2022 走看看