【帶着canvas去流浪(5)】繪製K線圖

圖片描述

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

博客園地址:《大史住在大前端》原創博文目錄html

華爲雲社區地址:【你要的前端打怪升級指南】前端

[TOC]git

一. 任務說明

使用原生canvasAPI繪製K線圖。(截圖以及數據來自於百度Echarts官方示例庫【查看示例連接】)。github

圖片描述

二. 重點提示

K線圖最多見的是在金融市場,尤爲是股市中,它的繪製算法和表達的意思是直接相關的:算法

  1. 通常一個數據點包含開盤價,收盤價,當日最高價,當日最低價4個數據點。
  2. 開盤價低於收盤價時,當天爲漲價,則圖形爲紅色,反之則爲綠色。
  3. 圖形中間的細線是當日最高價當日最低價之間的連線。
  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

圖片描述

相關文章
相關標籤/搜索