Canvas 畫折線圖

来源:https://www.cnblogs.com/hxblogs/archive/2020/07/07/13259059.html
-Advertisement-
Play Games

一、畫折線圖需要有如下準備如下: 1、繪製網格 2、繪製坐標系 3、繪製點 4、點連線就成了折線圖 二、繪製網格 1、確認網格(每個格子)的大小 2、確認X軸方向有多少條橫線 3、確認Y軸方向有多少條豎線 4、遍歷畫出來 <!DOCTYPE html> <html lang="en"> <head> ...


一、畫折線圖需要有如下準備如下:

  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>

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、繪製矩形 1、rect (x, y, width, height) : 繪製矩形的路徑 用軌跡畫的,不是獨立路徑( 沒有beginPath() ) 需要stroke()描邊才會顯示 2、strokeRect (x, y, width, height) : 描邊矩形 自動描邊,有獨立路徑 3、fi ...
  • 只能在render函數裡面使用JSX嗎 當然不是,你可以定義method,然後在method裡面返回JSX,然後在render函數裡面調用這個方法,不僅如此,JSX還可以直接賦值給變數,比如下麵這段代碼 methods: { $_renderFooter() { return ( <div> <El ...
  • 是時候使用JSX代替createElement了 接著上面的講,當我們看到上面用createElement去實現組件,太麻煩了,別說工作效率提高了,就是那些嵌套可以嵌套正確就很贊了,所以我們需要用JSX去簡化整個邏輯。當年我做項目的時候就遇到過這樣的情況,嵌套太多,自己都快搞不明白了,在崩潰的邊緣。 ...
  • HTML——超文本標記語言 HTMl裡面有標簽,標簽又分為單標簽和雙標簽,也分為行級元素和塊級元素 標簽是用<>包裹起來的,而且必須要有<>,否則會直接顯示在瀏覽器上面哦 現在介紹一下常用標簽 我們還要區分行級元素和塊級元素,塊級元素的特點是獨占一行,可以設置寬高,行級元素不能設置寬高,如果需要設置 ...
  • 學習JSX,先瞭解一下createElement 提到JSX,不可避免的就要提到createElement,當你看完本節,你會發現,奇怪的知識又增多了。ok,我們接著上一部分繼續講。這一次的準備工作是瞭解createElement。 從Vue編譯後的代碼看createElement 你是否看過寫的V ...
  • 1.前景怎麼樣? web前端人才需求還會持續增加 據國內權威數據統計,未來五年,我國信息化人才總需求量高達1500萬—2000萬人。其中“網路工程”“UI設計”“web前端”等人才的缺口最為突出,所以2020年web前端的市場需求還是很大的。更有甚者,目前不僅大型互聯網公司擬相繼成立了專屬的web ...
  • 編寫如下的函數: function drawHexagon(x,y,L) { ctx.beginPath(); ctx.moveTo(x-sqrt3/2*L,y-L/2); ctx.lineTo(x-sqrt3/2*L,y+L/2); ctx.lineTo(x,y+L); ctx.lineTo(x+ ...
  • 作者:騰訊有數 - TabPan Taro 引入了騰訊有數的微信小程式無痕埋點能力,為 Taro 的開發者提供真·零開發的 8 大無痕埋點能力以及自定義埋點能力,包含小程式啟動、顯示、隱藏、頁面瀏覽、頁面離開、分享、下拉刷新、上拉觸底等八大自動化埋點能力以及搜索、商品歸因等定製化埋點,以及經營分析、 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...