This is an automated email from the ASF dual-hosted git repository. ovilia pushed a commit to branch fix-11145 in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git
commit 1869232f59ffc0cd4adb0ee57b0d0a142ba12915 Author: Ovilia <zwl.s...@gmail.com> AuthorDate: Thu Oct 24 15:16:47 2019 +0800 fix(time): bar bandWidth with time axis #11145 --- src/layout/barGrid.js | 81 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/src/layout/barGrid.js b/src/layout/barGrid.js index b5c998b..f74bb6f 100644 --- a/src/layout/barGrid.js +++ b/src/layout/barGrid.js @@ -87,16 +87,91 @@ export function prepareLayoutBarSeries(seriesType, ecModel) { return seriesModels; } + +/** + * Map from axis.index to min gap of two adjacent time values. + * For a single time axis, return value is in the form like + * [[1000000]]. + * The value of 1000000 is in milliseconds. + */ +function getTimeAxesMinGaps(barSeries) { + /** + * Map from axis.index to time values. + * For a single time axis, axisValues is in the form like + * [[1495555200000, 1495641600000, 1495728000000]]. + * Items in axisValues[x], e.g. 1495555200000, are time values of all + * series. + */ + var axisValues = []; + zrUtil.each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + if (baseAxis.type !== 'time') { + return; + } + + var data = seriesModel.getData(); + var axisId = baseAxis.index; + for (var i = 0, cnt = data.count(); i < cnt; ++i) { + var value = data.get(baseAxis.dim, i); + if (!axisValues[axisId]) { + // No time value for the time axis + axisValues[axisId] = [value]; + } + else if (axisValues[axisId].indexOf(value) < 0) { + // No time value in previous series + axisValues[axisId].push(value); + } + // Ignore duplicated time values in the same time axis + } + }); + + var axisMinGaps = []; + for (var i = 0; i < axisValues.length; ++i) { + if (axisValues[i]) { + // Sort time values into ascending order to calculate gaps + axisValues[i] = axisValues[i].sort(function (a, b) { + return a - b; + }); + + var min = Number.MAX_VALUE; + for (var j = 1; j < axisValues[i].length; ++j) { + min = Math.min(min, axisValues[i][j] - axisValues[i][j - 1]); + } + // Set to null if only have one data + axisMinGaps[i] = min === Number.MAX_VALUE ? null : min; + } + } + return axisMinGaps; +} + export function makeColumnLayout(barSeries) { + var axisMinGaps = getTimeAxesMinGaps(barSeries); + var seriesInfoList = []; zrUtil.each(barSeries, function (seriesModel) { var data = seriesModel.getData(); var cartesian = seriesModel.coordinateSystem; var baseAxis = cartesian.getBaseAxis(); var axisExtent = baseAxis.getExtent(); - var bandWidth = baseAxis.type === 'category' - ? baseAxis.getBandWidth() - : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count()); + + var bandWidth; + switch (baseAxis.type) { + case 'category': + bandWidth = baseAxis.getBandWidth(); + break; + case 'time': + var minGap = axisMinGaps[baseAxis.index]; + var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]); + var scale = baseAxis.scale.getExtent(); + var scaleSpan = Math.abs(scale[1] - scale[0]); + bandWidth = minGap + ? extentSpan / scaleSpan * minGap + : extentSpan; // When there is only one data value + break; + default: + bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + } var barWidth = parsePercent( seriesModel.get('barWidth'), bandWidth --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@echarts.apache.org For additional commands, e-mail: commits-h...@echarts.apache.org