示例代碼託管在: http://www.github.com/dashnowords/blogs博客園地址:《大史住在大前端》原創博文目錄html
華爲雲社區地址:【你要的前端打怪升級指南】前端
[TOC]git
使用原生canvasAPI
繪製K線圖。(截圖以及數據來自於百度Echarts官方示例庫【查看示例連接】)。github
K線圖最多見的是在金融市場,尤爲是股市中,它的繪製算法和表達的意思是直接相關的:算法
開盤價
,收盤價
,當日最高價
,當日最低價
4個數據點。開盤價
低於收盤價
時,當天爲漲價,則圖形爲紅色,反之則爲綠色。當日最高價
和當日最低價
之間的連線。開盤價
和收盤價
之間的範圍。瞭解了上述基本知識,K線圖的繪製和折線圖其實並無太大區別,循序漸進去繪製就行了。若是仔細觀察Echarts
官方提供的示例會發現圖例中還有 MA5
,MA10
這樣的圖例標記,這裏其實指的是N天的移動平均值Moving Average N,是減少數據波動性展現其宏觀規律的經常使用方法之一,示例中的MA5
就是指依次將源數據中每5個點的值求平均值做爲當前點的數據(至於5個點是從當前點開始算,仍是從當前點結束都是能夠的)。canvas
實現難度較低,本文再也不贅述。瀏覽器
/*數據點來自於百度Echarts官方示例庫 * 每一個數據點意義:[日期,開盤(open),收盤(close),最低(lowest),最高(highest)] * 例如: ['2013/2/7', 2430.69,2418.53,2394.22,2433.89], */ /** * 繪製數據 */ 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][3])); context.lineTo(activeX,transCoord(data[i][4])); context.closePath(); context.stroke(); //繪製開盤收盤矩形 if (data[i][0] >= data[i][5]) { context.fillRect(activeX - 5 , transCoord(data[i][0]) , 10, transCoord(data[i][6]) - transCoord(data[i][0])); } else{ context.fillRect(activeX - 5 , transCoord(data[i][7]) , 10, transCoord(data[i][0]) - transCoord(data[i][8])); } } } //根據K線圖的數據中開盤價和收盤價計算繪圖顏色 function getColor(data) { return data[0] >= data[1] ? '#1abc9c' : '#DA5961'; } //從可視座標系座標轉換爲canvas座標系座標 function transCoord(coord) { return options.chartZone[3] - (options.chartZone[3] - options.chartZone[1])*(coord - options.yMin) / (options.yMax - options.yMin); }
瀏覽器中可查看效果:echarts