This is an automated email from the ASF dual-hosted git repository. sushuang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git
commit 346af22dc00cc3a084d908eafafdc6d35067d110 Author: sushuang <sushuang0...@gmail.com> AuthorDate: Wed Apr 4 02:55:51 2018 +0800 refactor candlestick. --- src/chart/candlestick/CandlestickView.js | 255 ++++++++++++++++++++++-- src/chart/candlestick/candlestickLayout.js | 43 ++--- src/chart/candlestick/candlestickVisual.js | 26 ++- src/chart/helper/WhiskerBoxDraw.js | 300 ----------------------------- src/chart/helper/whiskerBoxCommon.js | 32 --- test/candlestick.html | 5 + 6 files changed, 276 insertions(+), 385 deletions(-) diff --git a/src/chart/candlestick/CandlestickView.js b/src/chart/candlestick/CandlestickView.js index 622cf79..6f8d960 100644 --- a/src/chart/candlestick/CandlestickView.js +++ b/src/chart/candlestick/CandlestickView.js @@ -1,30 +1,173 @@ import * as zrUtil from 'zrender/src/core/util'; import ChartView from '../../view/Chart'; import * as graphic from '../../util/graphic'; -import {viewMixin} from '../helper/whiskerBoxCommon'; +import Path from 'zrender/src/graphic/Path'; + +var NORMAL_ITEM_STYLE_PATH = ['itemStyle']; +var EMPHASIS_ITEM_STYLE_PATH = ['emphasis', 'itemStyle']; var CandlestickView = ChartView.extend({ type: 'candlestick', - getStyleUpdater: function () { - return updateStyle; + render: function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + var pipelineContext = seriesModel.pipelineContext; + var isLargeRender = pipelineContext.large; + var largePoints = isLargeRender && data.getLayout('largePoints'); + + // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + if (!this._data) { + group.removeAll(); + } + + data.diff(oldData) + .add(function (newIdx) { + if (data.hasValue(newIdx)) { + var symbolEl = isLargeRender + ? createLargeBox(data, largePoints, newIdx) + : createNormalBox(data, newIdx, true); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }) + .update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + + // Empty data + if (!data.hasValue(newIdx)) { + group.remove(symbolEl); + return; + } + + if (symbolEl && symbolEl.__largeWhiskerBox ^ isLargeRender) { + group.remove(symbolEl); + symbolEl = null; + } + + if (!symbolEl) { + symbolEl = isLargeRender + ? createLargeBox(data, largePoints, newIdx) + : createNormalBox(data, newIdx); + } + else { + isLargeRender + ? updateLargeBoxData(symbolEl, data, newIdx) + : updateNormalBoxData(symbolEl, data, newIdx); + } + + // Add back + group.add(symbolEl); + + data.setItemGraphicEl(newIdx, symbolEl); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }) + .execute(); + + this._data = data; }, - dispose: zrUtil.noop + incrementalPrepareRender: function (seriesModel, ecModel, api) { + this.group.removeAll(); + this._data = null; + }, + + incrementalRender: function (params, seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var pipelineContext = seriesModel.pipelineContext; + var isLargeRender = pipelineContext.large; + var largePoints = isLargeRender && data.getLayout('largePoints'); + + for (var idx = params.start; idx < params.end; idx++) { + var symbolEl = isLargeRender + ? createLargeBox(data, largePoints, idx, params.start) + : createNormalBox(data, idx, this.styleUpdater, true); + symbolEl.incremental = true; + this.group.add(symbolEl); + } + }, + + remove: function (ecModel) { + var group = this.group; + var data = this._data; + this._data = null; + data && data.eachItemGraphicEl(function (el) { + el && group.remove(el); + }); + } + }); -zrUtil.mixin(CandlestickView, viewMixin, true); -// Update common properties -var normalStyleAccessPath = ['itemStyle']; -var emphasisStyleAccessPath = ['emphasis', 'itemStyle']; -function updateStyle(data, idx, boxEl, whiskerEl, bodyEl) { - var itemModel = data.getItemModel(idx); - var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath); - var color = data.getItemVisual(idx, 'color'); - var borderColor = data.getItemVisual(idx, 'borderColor') || color; + + +// --------------------- +// -- Normal Renderer -- +// --------------------- + +var NormalBoxPath = Path.extend({ + + type: 'candlestickBox', + + shape: {}, + + buildPath: function (ctx, shape) { + var ends = shape.points; + + ctx.moveTo(ends[0][0], ends[0][1]); + ctx.lineTo(ends[1][0], ends[1][1]); + ctx.lineTo(ends[2][0], ends[2][1]); + ctx.lineTo(ends[3][0], ends[3][1]); + ctx.closePath(); + + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[5][0], ends[5][1]); + ctx.moveTo(ends[6][0], ends[6][1]); + ctx.lineTo(ends[7][0], ends[7][1]); + } +}); + +function createNormalBox(data, dataIndex, isInit) { + var itemLayout = data.getItemLayout(dataIndex); + var ends = itemLayout.ends; + + var el = new NormalBoxPath({ + shape: { + points: isInit + ? transInit(ends, itemLayout) + : ends + }, + z2: 100 + }); + + updateNormalBoxData(el, data, dataIndex, isInit); + + return el; +} + +function updateNormalBoxData(el, data, dataIndex, isInit) { + var seriesModel = data.hostModel; + var itemLayout = data.getItemLayout(dataIndex); + var updateMethod = graphic[isInit ? 'initProps' : 'updateProps']; + + updateMethod( + el, + {shape: {points: itemLayout.ends}}, + seriesModel, + dataIndex + ); + + var itemModel = data.getItemModel(dataIndex); + var normalItemStyleModel = itemModel.getModel(NORMAL_ITEM_STYLE_PATH); + var color = data.getItemVisual(dataIndex, 'color'); + var borderColor = data.getItemVisual(dataIndex, 'borderColor') || color; // Color must be excluded. // Because symbol provide setColor individually to set fill and stroke @@ -32,15 +175,89 @@ function updateStyle(data, idx, boxEl, whiskerEl, bodyEl) { ['color', 'color0', 'borderColor', 'borderColor0'] ); - whiskerEl.useStyle(itemStyle); - whiskerEl.style.stroke = borderColor; + el.useStyle(itemStyle); + el.style.strokeNoScale = true; + el.style.fill = color; + el.style.stroke = borderColor; - bodyEl.useStyle(itemStyle); - bodyEl.style.fill = color; - bodyEl.style.stroke = borderColor; + var hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle(); + graphic.setHoverStyle(el, hoverStyle); +} + +function transInit(points, itemLayout) { + return zrUtil.map(points, function (point) { + point = point.slice(); + point[1] = itemLayout.initBaseline; + return point; + }); +} + + + + + + +// -------------------- +// -- Large Renderer -- +// -------------------- + +var NORMAL_STYLE_ACCESS_PATH = ['itemStyle']; +var EMPHASIS_STYLE_ACCESS_PATH = ['emphasis', 'itemStyle']; + +function createLargeBox(data, largePoints, dataIndex, segmentStart) { + var boxEl = new graphic.Line({ + shape: largeBoxMakeShape(largePoints, dataIndex, segmentStart) + }); + + boxEl.__largeWhiskerBox = true; + + largeBoxSetStyle(boxEl, data, dataIndex); + + return boxEl; +} + +function largeBoxMakeShape(largePoints, dataIndex, segmentStart) { + var baseIdx = (dataIndex - (segmentStart || 0)) * 5; + return { + x1: largePoints[baseIdx + 1], + y1: largePoints[baseIdx + 2], + x2: largePoints[baseIdx + 3], + y2: largePoints[baseIdx + 4] + }; +} - var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle(); +function updateLargeBoxData(boxEl, data, dataIndex) { + graphic.updateProps( + boxEl, + {shape: largeBoxMakeShape(data.getLayout('largePoints'), dataIndex, 0)}, + data.hostModel, + dataIndex + ); + + largeBoxSetStyle(boxEl, data, dataIndex); +} + +function largeBoxSetStyle(boxEl, data, dataIndex) { + var itemModel = data.getItemModel(dataIndex); + var normalItemStyleModel = itemModel.getModel(NORMAL_STYLE_ACCESS_PATH); + var color = data.getItemVisual(dataIndex, 'color'); + var borderColor = data.getItemVisual(dataIndex, 'borderColor') || color; + + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + var itemStyle = normalItemStyleModel.getItemStyle( + ['color', 'color0', 'borderColor', 'borderColor0'] + ); + + boxEl.useStyle(itemStyle); + boxEl.style.stroke = borderColor; + + var hoverStyle = itemModel.getModel(EMPHASIS_STYLE_ACCESS_PATH).getItemStyle(); graphic.setHoverStyle(boxEl, hoverStyle); } + + + export default CandlestickView; + diff --git a/src/chart/candlestick/candlestickLayout.js b/src/chart/candlestick/candlestickLayout.js index 929d93b..6fa8fda 100644 --- a/src/chart/candlestick/candlestickLayout.js +++ b/src/chart/candlestick/candlestickLayout.js @@ -18,9 +18,8 @@ export default { var coordSys = seriesModel.coordinateSystem; var data = seriesModel.getData(); var candleWidth = calculateCandleWidth(seriesModel, data); - var chartLayout = seriesModel.get('layout'); - var cDimIdx = chartLayout === 'horizontal' ? 0 : 1; - var vDimIdx = 1 - cDimIdx; + var cDimIdx = 0; + var vDimIdx = 1; var coordDims = ['x', 'y']; var cDim = data.mapDimension(coordDims[cDimIdx]); var vDims = data.mapDimension(coordDims[vDimIdx], true); @@ -39,10 +38,7 @@ export default { function normalProgress(params, data) { for (var dataIndex = params.start; dataIndex < params.end; dataIndex++) { - layoutDataItem(dataIndex); - } - function layoutDataItem(dataIndex) { var axisDimVal = data.get(cDim, dataIndex); var openVal = data.get(openDim, dataIndex); var closeVal = data.get(closeDim, dataIndex); @@ -57,28 +53,22 @@ export default { var lowestPoint = getPoint(lowestVal, axisDimVal); var highestPoint = getPoint(highestVal, axisDimVal); - var whiskerEnds = [ - [ - subPixelOptimizePoint(highestPoint), - subPixelOptimizePoint(ocHighPoint) - ], - [ - subPixelOptimizePoint(lowestPoint), - subPixelOptimizePoint(ocLowPoint) - ] - ]; - - var bodyEnds = []; - addBodyEnd(bodyEnds, ocHighPoint, 0); - addBodyEnd(bodyEnds, ocLowPoint, 1); + var ends = []; + addBodyEnd(ends, ocHighPoint, 0); + addBodyEnd(ends, ocLowPoint, 1); + + ends.push( + subPixelOptimizePoint(highestPoint), + subPixelOptimizePoint(ocHighPoint), + subPixelOptimizePoint(lowestPoint), + subPixelOptimizePoint(ocLowPoint) + ); data.setItemLayout(dataIndex, { - chartLayout: chartLayout, sign: getSign(data, dataIndex, openVal, closeVal, closeDim), initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], // open point. - bodyEnds: bodyEnds, - whiskerEnds: whiskerEnds, + ends: ends, brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal) }); } @@ -92,7 +82,7 @@ export default { : coordSys.dataToPoint(p); } - function addBodyEnd(bodyEnds, point, start) { + function addBodyEnd(ends, point, start) { var point1 = point.slice(); var point2 = point.slice(); @@ -104,8 +94,8 @@ export default { ); start - ? bodyEnds.push(point1, point2) - : bodyEnds.push(point2, point1); + ? ends.push(point1, point2) + : ends.push(point2, point1); } function makeBrushRect(lowestVal, highestVal, axisDimVal) { @@ -168,7 +158,6 @@ export default { data.setLayout('largePoints', points); data.setLayout('candleWidth', candleWidth); - data.setLayout('candleWidth', candleWidth); } } }; diff --git a/src/chart/candlestick/candlestickVisual.js b/src/chart/candlestick/candlestickVisual.js index d4cf012..ad94894 100644 --- a/src/chart/candlestick/candlestickVisual.js +++ b/src/chart/candlestick/candlestickVisual.js @@ -22,7 +22,11 @@ export default { var largePoints = isLargeRender && data.getLayout('largePoints'); data.setVisual({ - legendSymbol: 'roundRect' + legendSymbol: 'roundRect', + colorP: getColor(1, seriesModel), + colorN: getColor(-1, seriesModel), + borderColorP: getBorderColor(1, seriesModel), + borderColorN: getBorderColor(-1, seriesModel) }); // Only visible series has each data be visual encoded @@ -40,17 +44,25 @@ export default { data.setItemVisual( dataIndex, { - color: itemModel.get( - sign > 0 ? positiveColorQuery : negativeColorQuery - ), - borderColor: itemModel.get( - sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery - ) + color: getColor(sign, itemModel), + borderColor: getBorderColor(sign, itemModel) } ); } } + function getColor(sign, model) { + return model.get( + sign > 0 ? positiveColorQuery : negativeColorQuery + ); + } + + function getBorderColor(sign, model) { + return model.get( + sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery + ); + } + return {progress: progress}; } diff --git a/src/chart/helper/WhiskerBoxDraw.js b/src/chart/helper/WhiskerBoxDraw.js deleted file mode 100644 index 1753633..0000000 --- a/src/chart/helper/WhiskerBoxDraw.js +++ /dev/null @@ -1,300 +0,0 @@ -/** - * @module echarts/chart/helper/Symbol - */ - -import * as zrUtil from 'zrender/src/core/util'; -import * as graphic from '../../util/graphic'; -import Path from 'zrender/src/graphic/Path'; - - - - -// ------------------ -// -- Whisker Path -- -// ------------------ - -var WhiskerPath = Path.extend({ - - type: 'whiskerInBox', - - shape: {}, - - buildPath: function (ctx, shape) { - for (var i in shape) { - if (shape.hasOwnProperty(i) && i.indexOf('ends') === 0) { - var pts = shape[i]; - ctx.moveTo(pts[0][0], pts[0][1]); - ctx.lineTo(pts[1][0], pts[1][1]); - } - } - } -}); - - - - -// ---------------- -// -- Normal Box -- -// ---------------- - - -var BODY_INDEX = 0; -var WHISKER_INDEX = 1; - -/** - * @param {module:echarts/data/List} data - * @param {number} idx - * @param {Function} styleUpdater - * @param {boolean} isInit - */ -function createNormalBox(data, dataIndex, styleUpdater, isInit) { - var boxEl = new graphic.Group(); - - var itemLayout = data.getItemLayout(dataIndex); - var constDim = itemLayout.chartLayout === 'horizontal' ? 1 : 0; - - // Whisker element. - boxEl.add(new graphic.Polygon({ - shape: { - points: isInit - ? transInit(itemLayout.bodyEnds, constDim, itemLayout) - : itemLayout.bodyEnds - }, - style: {strokeNoScale: true}, - z2: 100 - })); - - // Box element. - var whiskerEnds = zrUtil.map(itemLayout.whiskerEnds, function (ends) { - return isInit ? transInit(ends, constDim, itemLayout) : ends; - }); - boxEl.add(new WhiskerPath({ - shape: makeWhiskerEndsShape(whiskerEnds), - style: {strokeNoScale: true}, - z2: 100 - })); - - updateNormalBoxData(boxEl, data, dataIndex, styleUpdater, isInit); - - return boxEl; -} - -function updateNormalBoxData(boxEl, data, dataIndex, styleUpdater, isInit) { - var seriesModel = boxEl._seriesModel = data.hostModel; - var itemLayout = data.getItemLayout(dataIndex); - var updateMethod = graphic[isInit ? 'initProps' : 'updateProps']; - var whiskerEl = boxEl.childAt(WHISKER_INDEX); - var bodyEl = boxEl.childAt(BODY_INDEX); - - updateMethod( - bodyEl, - {shape: {points: itemLayout.bodyEnds}}, - seriesModel, dataIndex - ); - updateMethod( - whiskerEl, - {shape: makeWhiskerEndsShape(itemLayout.whiskerEnds)}, - seriesModel, dataIndex - ); - - styleUpdater(data, dataIndex, boxEl, whiskerEl, bodyEl); -} - -function transInit(points, dim, itemLayout) { - return zrUtil.map(points, function (point) { - point = point.slice(); - point[dim] = itemLayout.initBaseline; - return point; - }); -} - -function makeWhiskerEndsShape(whiskerEnds) { - // zr animation only support 2-dim array. - var shape = {}; - zrUtil.each(whiskerEnds, function (ends, i) { - shape['ends' + i] = ends; - }); - return shape; -} - - - - -// --------------- -// -- Large Box -- -// --------------- - -var NORMAL_STYLE_ACCESS_PATH = ['itemStyle']; -var EMPHASIS_STYLE_ACCESS_PATH = ['emphasis', 'itemStyle']; - -function createLargeBox(data, largePoints, dataIndex, segmentStart) { - var boxEl = new graphic.Line({ - shape: largeBoxMakeShape(largePoints, dataIndex, segmentStart) - }); - - boxEl.__largeWhiskerBox = true; - - largeBoxSetStyle(boxEl, data, dataIndex); - - return boxEl; -} - -function largeBoxMakeShape(largePoints, dataIndex, segmentStart) { - var baseIdx = (dataIndex - (segmentStart || 0)) * 5; - return { - x1: largePoints[baseIdx + 1], - y1: largePoints[baseIdx + 2], - x2: largePoints[baseIdx + 3], - y2: largePoints[baseIdx + 4] - }; -} - -function updateLargeBoxData(boxEl, data, dataIndex) { - graphic.updateProps( - boxEl, - {shape: largeBoxMakeShape(data.getLayout('largePoints'), dataIndex, 0)}, - data.hostModel, - dataIndex - ); - - largeBoxSetStyle(boxEl, data, dataIndex); -} - -function largeBoxSetStyle(boxEl, data, dataIndex) { - var itemModel = data.getItemModel(dataIndex); - var normalItemStyleModel = itemModel.getModel(NORMAL_STYLE_ACCESS_PATH); - var color = data.getItemVisual(dataIndex, 'color'); - var borderColor = data.getItemVisual(dataIndex, 'borderColor') || color; - - // Color must be excluded. - // Because symbol provide setColor individually to set fill and stroke - var itemStyle = normalItemStyleModel.getItemStyle( - ['color', 'color0', 'borderColor', 'borderColor0'] - ); - - boxEl.useStyle(itemStyle); - boxEl.style.stroke = borderColor; - - var hoverStyle = itemModel.getModel(EMPHASIS_STYLE_ACCESS_PATH).getItemStyle(); - graphic.setHoverStyle(boxEl, hoverStyle); -} - - - - -// -------------------- -// -- WhiskerBoxDraw -- -// -------------------- - -/** - * @constructor - * @alias module:echarts/chart/helper/WhiskerBoxDraw - */ -function WhiskerBoxDraw(styleUpdater) { - this.group = new graphic.Group(); - this.styleUpdater = styleUpdater; -} - -var whiskerBoxDrawProto = WhiskerBoxDraw.prototype; - -/** - * Update symbols draw by new data - * @param {module:echarts/data/List} data - */ -whiskerBoxDrawProto.updateData = function (data) { - var group = this.group; - var oldData = this._data; - var styleUpdater = this.styleUpdater; - var pipelineContext = data.hostModel.pipelineContext; - var isLargeRender = pipelineContext.large; - var largePoints = isLargeRender && data.getLayout('largePoints'); - - // There is no old data only when first rendering or switching from - // stream mode to normal mode, where previous elements should be removed. - if (!this._data) { - group.removeAll(); - } - - data.diff(oldData) - .add(function (newIdx) { - if (data.hasValue(newIdx)) { - var symbolEl = isLargeRender - ? createLargeBox(data, largePoints, newIdx) - : createNormalBox(data, newIdx, styleUpdater, true); - data.setItemGraphicEl(newIdx, symbolEl); - group.add(symbolEl); - } - }) - .update(function (newIdx, oldIdx) { - var symbolEl = oldData.getItemGraphicEl(oldIdx); - - // Empty data - if (!data.hasValue(newIdx)) { - group.remove(symbolEl); - return; - } - - if (symbolEl && symbolEl.__largeWhiskerBox ^ isLargeRender) { - group.remove(symbolEl); - symbolEl = null; - } - - if (!symbolEl) { - symbolEl = isLargeRender - ? createLargeBox(data, largePoints, newIdx) - : createNormalBox(data, newIdx, styleUpdater); - } - else { - isLargeRender - ? updateLargeBoxData(symbolEl, data, newIdx) - : updateNormalBoxData(symbolEl, data, newIdx, styleUpdater); - } - - // Add back - group.add(symbolEl); - - data.setItemGraphicEl(newIdx, symbolEl); - }) - .remove(function (oldIdx) { - var el = oldData.getItemGraphicEl(oldIdx); - el && group.remove(el); - }) - .execute(); - - this._data = data; -}; - -whiskerBoxDrawProto.incrementalPrepareUpdate = function (seriesModel, ecModel, api) { - this.group.removeAll(); - this._data = null; -}; - -whiskerBoxDrawProto.incrementalUpdate = function (params, seriesModel, ecModel, api) { - var data = seriesModel.getData(); - var pipelineContext = seriesModel.pipelineContext; - var isLargeRender = pipelineContext.large; - var largePoints = isLargeRender && data.getLayout('largePoints'); - - for (var idx = params.start; idx < params.end; idx++) { - var symbolEl = isLargeRender - ? createLargeBox(data, largePoints, idx, params.start) - : createNormalBox(data, idx, this.styleUpdater, true); - symbolEl.incremental = true; - this.group.add(symbolEl); - } -}; - -/** - * Remove symbols. - * @param {module:echarts/data/List} data - */ -whiskerBoxDrawProto.remove = function () { - var group = this.group; - var data = this._data; - this._data = null; - data && data.eachItemGraphicEl(function (el) { - el && group.remove(el); - }); -}; - -export default WhiskerBoxDraw; diff --git a/src/chart/helper/whiskerBoxCommon.js b/src/chart/helper/whiskerBoxCommon.js index b9fd4e2..714cd44 100644 --- a/src/chart/helper/whiskerBoxCommon.js +++ b/src/chart/helper/whiskerBoxCommon.js @@ -1,6 +1,5 @@ import createListSimply from '../helper/createListSimply'; -import WhiskerBoxDraw from '../helper/WhiskerBoxDraw'; import * as zrUtil from 'zrender/src/core/util'; import {getDimensionTypeByAxis} from '../../data/helper/dimensionHelper'; @@ -110,34 +109,3 @@ export var seriesModelMixin = { } }; - -export var viewMixin = { - - init: function () { - /** - * Old data. - * @private - * @type {module:echarts/chart/helper/WhiskerBoxDraw} - */ - var whiskerBoxDraw = this._whiskerBoxDraw = new WhiskerBoxDraw( - this.getStyleUpdater() - ); - this.group.add(whiskerBoxDraw.group); - }, - - render: function (seriesModel, ecModel, api) { - this._whiskerBoxDraw.updateData(seriesModel.getData()); - }, - - incrementalPrepareRender: function (seriesModel, ecModel, api) { - this._whiskerBoxDraw.incrementalPrepareUpdate(seriesModel, ecModel, api); - }, - - incrementalRender: function (params, seriesModel, ecModel, api) { - this._whiskerBoxDraw.incrementalUpdate(params, seriesModel, ecModel, api); - }, - - remove: function (ecModel) { - this._whiskerBoxDraw.remove(); - } -}; diff --git a/test/candlestick.html b/test/candlestick.html index 14d3bbc..3150b86 100644 --- a/test/candlestick.html +++ b/test/candlestick.html @@ -150,6 +150,11 @@ name: '上证指数', type: 'candlestick', data: data.values, + // itemStyle: { + // borderColor: '#345', + // borderColor0: '#998', + // borderWidth: 2 + // }, tooltip: { formatter: function (param) { var param = param[0]; -- To stop receiving notification emails like this one, please contact sushu...@apache.org. --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@echarts.apache.org For additional commands, e-mail: commits-h...@echarts.apache.org