帶著canvas流浪系列之五 繪制K線圖

      網(wǎng)友投稿 633 2025-04-02

      示例代碼托管在:http://www.github.com/dashnowords/blogs


      博客園地址:《大史住在大前端》原創(chuàng)博文目錄

      華為云社區(qū)地址:【你要的前端打怪升級指南】

      【帶著canvas去流浪(5)】繪制K線圖一. 任務說明二. 重點提示三. 示例代碼

      一. 任務說明

      使用原生canvasAPI繪制K線圖。(截圖以及數(shù)據(jù)來自于百度Echarts官方示例庫【查看示例鏈接】)。

      二. 重點提示

      K線圖最常見的是在金融市場,尤其是股市中,它的繪制算法和表達的意思是直接相關(guān)的:

      一般一個數(shù)據(jù)點包含開盤價,收盤價,當日最高價,當日最低價4個數(shù)據(jù)點。

      當開盤價低于收盤價時,當天為漲價,則圖形為紅色,反之則為綠色。

      圖形中間的細線是當日最高價和當日最低價之間的連線。

      圖形中的矩形是在開盤價和收盤價之間的范圍。

      了解了上述基本知識,K線圖的繪制和折線圖其實并沒有太大區(qū)別,按部就班去繪制就好了。如果仔細觀察Echarts官方提供的示例會發(fā)現(xiàn)圖例中還有 MA5,MA10這樣的圖例標記,這里其實指的是N天的移動平均值Moving Average N,是減小數(shù)據(jù)波動性展示其宏觀規(guī)律的常用方法之一,示例中的MA5就是指依次將源數(shù)據(jù)中每5個點的值求平均值作為當前點的數(shù)據(jù)(至于5個點是從當前點開始算,還是從當前點結(jié)束都是可以的)。

      三. 示例代碼

      實現(xiàn)難度較低,本文不再贅述。

      /*數(shù)據(jù)點來自于百度Echarts官方示例庫

      * 每個數(shù)據(jù)點意義:[日期,開盤(open),收盤(close),最低(lowest),最高(highest)]

      * 例如: ['2013/2/7', 2430.69,2418.53,2394.22,2433.89],

      帶著canvas去流浪系列之五 繪制K線圖

      */

      /**

      * 繪制數(shù)據(jù)

      */

      function drawData(options) {

      let data = options.data;

      let xLength = options.chartZone[2] - options.chartZone[0];

      let c;//記錄當前繪制點的顏色

      let gap = xLength / options.xAxisLabel.length;

      let activeX = ?0;//記錄繪制過程中當前點的坐標

      let activeY = ?0;//記錄繪制過程中當前點的y坐標

      context.strokeWidth = 2;

      context.beginPath();

      context.moveTo(options.chartZone[0],options.chartZone[3]);//先將起點移動至0,0坐標

      for(let i = 0; i < data.length; i++){

      //獲取繪圖顏色

      c = getColor(data[i]);

      context.strokeWidth = 1;

      context.strokeStyle = context.fillStyle = c;

      //計算繪制中心點x坐標

      activeX = options.chartZone[0] + (i + 1) * gap;

      //繪制最高最低線;

      context.beginPath();

      context.moveTo(activeX,transCoord(data[i][2]));

      context.lineTo(activeX,transCoord(data[i][3]));

      context.closePath();

      context.stroke();

      //繪制開盤收盤矩形

      if (data[i][0] >= data[i][1]) {

      context.fillRect(activeX - 5 , transCoord(data[i][0]) , 10, transCoord(data[i][1]) - transCoord(data[i][0]));

      } else{

      context.fillRect(activeX - 5 , transCoord(data[i][1]) , 10, transCoord(data[i][0]) - transCoord(data[i][1]));

      }

      }

      }

      //根據(jù)K線圖的數(shù)據(jù)中開盤價和收盤價計算繪圖顏色

      function getColor(data) {

      return data[0] >= data[1] ? '#1abc9c' : '#DA5961';

      }

      //從可視坐標系坐標轉(zhuǎn)換為canvas坐標系坐標

      function transCoord(coord) {

      return options.chartZone[3] - (options.chartZone[3] - options.chartZone[1])*(coord - options.yMin) / (options.yMax - options.yMin);

      }

      瀏覽器中可查看效果:

      附件: demo.rar 3.82KB 下載次數(shù):5次

      Canvas

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Word 2013多種內(nèi)置樣式集的使用方法(word文檔打字時會消掉后面字)
      下一篇:wps培訓的教程(WPS培訓班)
      相關(guān)文章
      国产精品久久亚洲一区二区| 亚洲精品亚洲人成在线麻豆| 亚洲人成7777| 久久久亚洲欧洲日产国码二区| 亚洲深深色噜噜狠狠爱网站| 亚洲人成无码网WWW| 亚洲精品无码久久毛片| 精品韩国亚洲av无码不卡区| 久久亚洲精品无码av| 亚洲爆乳精品无码一区二区| 国产亚洲人成在线播放| 在线观看亚洲视频| 亚洲XX00视频| 久久久久噜噜噜亚洲熟女综合| 久久亚洲中文字幕精品一区| 在线观看亚洲精品国产| 亚洲情综合五月天| 亚洲av综合avav中文| 亚洲视频在线视频| 亚洲一区二区三区久久| 97久久国产亚洲精品超碰热| 亚洲日韩中文字幕一区| 亚洲av成人一区二区三区在线播放| 人人狠狠综合久久亚洲| mm1313亚洲精品国产| 亚洲AV成人精品日韩一区18p| 久久久久亚洲精品男人的天堂| 亚洲精品无码专区久久久| 久久久久亚洲AV成人无码网站| 91在线精品亚洲一区二区| 亚洲国产精品综合久久2007| 激情亚洲一区国产精品| 亚洲国产精品99久久久久久| 亚洲&#228;v永久无码精品天堂久久 | 亚洲图片一区二区| 亚洲人成高清在线播放| 亚洲成av人片在线天堂无| xvideos亚洲永久网址| 亚洲人成图片小说网站| 久久久亚洲欧洲日产国码aⅴ | 亚洲一区二区三区在线播放|