UNPKG

@29aries/apexcharts

Version:

Interactive JavaScript Charts built on SVG - forked by 29aries to allow custom labels - forked from 3.20.0

253 lines (205 loc) 6.2 kB
import CoreUtils from '../modules/CoreUtils' import Bar from './Bar' import Fill from '../modules/Fill' import Graphics from '../modules/Graphics' import Utils from '../utils/Utils' /** * ApexCharts CandleStick Class responsible for drawing both Stacked Columns and Bars. * * @module CandleStick **/ class CandleStick extends Bar { draw(series, seriesIndex) { let w = this.w let graphics = new Graphics(this.ctx) let fill = new Fill(this.ctx) this.candlestickOptions = this.w.config.plotOptions.candlestick const coreUtils = new CoreUtils(this.ctx, w) series = coreUtils.getLogSeries(series) this.series = series this.yRatio = coreUtils.getLogYRatios(this.yRatio) this.barHelpers.initVariables(series) let ret = graphics.group({ class: 'apexcharts-candlestick-series apexcharts-plot-series' }) for (let i = 0; i < series.length; i++) { let x, y, xDivision, // xDivision is the GRIDWIDTH divided by number of datapoints (columns) zeroH // zeroH is the baseline where 0 meets y axis let yArrj = [] // hold y values of current iterating series let xArrj = [] // hold x values of current iterating series let realIndex = w.globals.comboCharts ? seriesIndex[i] : i // el to which series will be drawn let elSeries = graphics.group({ class: `apexcharts-series`, seriesName: Utils.escapeString(w.globals.seriesNames[realIndex]), rel: i + 1, 'data:realIndex': realIndex }) if (series[i].length > 0) { this.visibleI = this.visibleI + 1 } let barHeight = 0 let barWidth = 0 if (this.yRatio.length > 1) { this.yaxisIndex = realIndex } let initPositions = this.barHelpers.initialPositions() y = initPositions.y barHeight = initPositions.barHeight x = initPositions.x barWidth = initPositions.barWidth xDivision = initPositions.xDivision zeroH = initPositions.zeroH xArrj.push(x + barWidth / 2) // eldatalabels let elDataLabelsWrap = graphics.group({ class: 'apexcharts-datalabels', 'data:realIndex': realIndex }) for (let j = 0; j < w.globals.dataPoints; j++) { const strokeWidth = this.barHelpers.getStrokeWidth(i, j, realIndex) let color let paths = this.drawCandleStickPaths({ indexes: { i, j, realIndex }, x, y, xDivision, barWidth, zeroH, strokeWidth, elSeries }) y = paths.y x = paths.x color = paths.color // push current X if (j > 0) { xArrj.push(x + barWidth / 2) } yArrj.push(y) let pathFill = fill.fillPath({ seriesNumber: realIndex, dataPointIndex: j, color, value: series[i][j] }) let lineFill = this.candlestickOptions.wick.useFillColor ? color : undefined this.renderSeries({ realIndex, pathFill, lineFill, j, i, pathFrom: paths.pathFrom, pathTo: paths.pathTo, strokeWidth, elSeries, x, y, series, barHeight, barWidth, elDataLabelsWrap, visibleSeries: this.visibleI, type: 'candlestick' }) } // push all x val arrays into main xArr w.globals.seriesXvalues[realIndex] = xArrj w.globals.seriesYvalues[realIndex] = yArrj ret.add(elSeries) } return ret } drawCandleStickPaths({ indexes, x, y, xDivision, barWidth, zeroH, strokeWidth }) { let w = this.w let graphics = new Graphics(this.ctx) let i = indexes.i let j = indexes.j let isPositive = true let colorPos = w.config.plotOptions.candlestick.colors.upward let colorNeg = w.config.plotOptions.candlestick.colors.downward const yRatio = this.yRatio[this.yaxisIndex] let realIndex = indexes.realIndex const ohlc = this.getOHLCValue(realIndex, j) let l1 = zeroH let l2 = zeroH if (ohlc.o > ohlc.c) { isPositive = false } let y1 = Math.min(ohlc.o, ohlc.c) let y2 = Math.max(ohlc.o, ohlc.c) if (w.globals.isXNumeric) { x = (w.globals.seriesX[realIndex][j] - w.globals.minX) / this.xRatio - barWidth / 2 } let barXPosition = x + barWidth * this.visibleI if ( typeof this.series[i][j] === 'undefined' || this.series[i][j] === null ) { y1 = zeroH } else { y1 = zeroH - y1 / yRatio y2 = zeroH - y2 / yRatio l1 = zeroH - ohlc.h / yRatio l2 = zeroH - ohlc.l / yRatio } let pathTo = graphics.move(barXPosition, zeroH) let pathFrom = graphics.move(barXPosition, y1) if (w.globals.previousPaths.length > 0) { pathFrom = this.getPreviousPath(realIndex, j, true) } pathTo = graphics.move(barXPosition, y2) + graphics.line(barXPosition + barWidth / 2, y2) + graphics.line(barXPosition + barWidth / 2, l1) + graphics.line(barXPosition + barWidth / 2, y2) + graphics.line(barXPosition + barWidth, y2) + graphics.line(barXPosition + barWidth, y1) + graphics.line(barXPosition + barWidth / 2, y1) + graphics.line(barXPosition + barWidth / 2, l2) + graphics.line(barXPosition + barWidth / 2, y1) + graphics.line(barXPosition, y1) + graphics.line(barXPosition, y2 - strokeWidth / 2) pathFrom = pathFrom + graphics.move(barXPosition, y1) if (!w.globals.isXNumeric) { x = x + xDivision } return { pathTo, pathFrom, x, y: y2, barXPosition, color: isPositive ? colorPos : colorNeg } } getOHLCValue(i, j) { const w = this.w return { o: w.globals.seriesCandleO[i][j], h: w.globals.seriesCandleH[i][j], l: w.globals.seriesCandleL[i][j], c: w.globals.seriesCandleC[i][j] } } } export default CandleStick