diff --git a/src/chart/line/LineView.js b/src/chart/line/LineView.js index 7c377bb01bd73ea3c332b40d86a25bdedcf7e264..8a521a8833a85b48c063d1ed025aefbe43765363 100644 --- a/src/chart/line/LineView.js +++ b/src/chart/line/LineView.js @@ -364,13 +364,8 @@ define(function(require) { _getSymbolIgnoreFunc: function (data, coordSys) { var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; // `getLabelInterval` is provided by echarts/component/axis - if (categoryAxis && categoryAxis.getLabelInterval) { - var labelInterval = categoryAxis.getLabelInterval(); - return function (idx) { - return (typeof labelInterval === 'function') - && !labelInterval(idx, categoryAxis.scale.getLabel(idx)) - || idx % (labelInterval + 1); - }; + if (categoryAxis && categoryAxis.isLabelIgnored) { + return zrUtil.bind(categoryAxis.isLabelIgnored, categoryAxis); } }, diff --git a/src/coord/cartesian/Axis2D.js b/src/coord/cartesian/Axis2D.js index c2bff3c19f8980ef1389be366fcd05efe0348533..536763e133b562c10d235efed5343d5e3d22f5e1 100644 --- a/src/coord/cartesian/Axis2D.js +++ b/src/coord/cartesian/Axis2D.js @@ -65,6 +65,21 @@ define(function (require) { labelInterval = this._labelInterval = axisLabelInterval(this); } return labelInterval; + }, + + /** + * If label is ignored. + * Automatically used when axis is category and label can not be all shown + * @param {number} idx + * @return {boolean} + */ + isLabelIgnored: function (idx) { + if (this.type === 'category') { + var labelInterval = this.getLabelInterval(); + return ((typeof labelInterval === 'function') + && !labelInterval(idx, this.scale.getLabel(idx))) + || idx % (labelInterval + 1); + } } }; zrUtil.inherits(Axis2D, Axis); diff --git a/src/coord/cartesian/AxisModel.js b/src/coord/cartesian/AxisModel.js index 8231baf46a897265efef95154c99af6233bd8088..b0186666a9e58e4603355bd55ee54bd7c4bbc52e 100644 --- a/src/coord/cartesian/AxisModel.js +++ b/src/coord/cartesian/AxisModel.js @@ -31,7 +31,9 @@ define(function(require) { zrUtil.merge(AxisModel.prototype, require('../axisModelCommonMixin')); - var extraOption = {gridIndex: 0}; + var extraOption = { + gridIndex: 0 + }; axisModelCreator('x', AxisModel, getAxisType, extraOption); axisModelCreator('y', AxisModel, getAxisType, extraOption); diff --git a/src/coord/cartesian/Grid.js b/src/coord/cartesian/Grid.js index 8235b657333445eeac116274acc0a472a08beb1a..0d9cda3d9ca1b6becd84f6ebbe0a38fb0a36a860 100644 --- a/src/coord/cartesian/Grid.js +++ b/src/coord/cartesian/Grid.js @@ -30,6 +30,19 @@ define(function(require, factory) { return ecModel.getComponent('grid', axisModel.get('gridIndex')) === gridModel; } + function getLabelUnionRect(axis) { + var axisModel = axis.model; + var labels = axisModel.getFormattedLabels(); + var rect; + for (var i = 0; i < labels.length; i++) { + if (!axis.isLabelIgnored(i)) { + var singleRect = axisModel.getTextRect(labels[i]); + rect ? rect.union(singleRect) : (rect = singleRect); + } + } + return rect; + } + function Grid(gridModel, ecModel, api) { /** * @type {Object.} @@ -87,7 +100,24 @@ define(function(require, factory) { this._rect = gridRect; - each(this._axesList, function (axis) { + var axesList = this._axesList; + // Minus label size + if (gridModel.get('containLabel')) { + each(axesList, function (axis) { + var labelUnionRect = getLabelUnionRect(axis); + var dim = axis.isHorizontal() ? 'height' : 'width'; + var margin = axis.model.get('axisLabel.margin'); + gridRect[dim] -= labelUnionRect[dim]; + if (axis.isHorizontal()) { + gridRect.y += (axis.position === 'top' ? 1 : -1) * (labelUnionRect.height + margin); + } + else { + gridRect.x += (axis.position === 'left' ? 1 : -1) * (labelUnionRect.width + margin); + } + }); + } + + each(axesList, function (axis) { var isHorizontal = axis.isHorizontal(); var extent = isHorizontal ? [gridRect.x, gridRect.x + gridRect.width] diff --git a/src/coord/cartesian/GridModel.js b/src/coord/cartesian/GridModel.js index 518fa1a768a7d33dc3459a0497feb2e0b31d3b7f..f22f05486b522eb8680b7b8a650c095f84211828 100644 --- a/src/coord/cartesian/GridModel.js +++ b/src/coord/cartesian/GridModel.js @@ -6,9 +6,7 @@ define(function(require) { require('./AxisModel'); - var zrUtil = require('zrender/core/util'); - - var GridModel = require('../../echarts').extendComponentModel({ + return require('../../echarts').extendComponentModel({ type: 'grid', @@ -23,10 +21,12 @@ define(function(require) { show: false, zlevel: 0, // 一级层叠 z: 0, // 二级层叠 - x: 80, + x: '10%', y: 60, - x2: 80, + x2: '10%', y2: 60, + // If grid size contain label + containLabel: false, // width: {totalWidth} - x - x2, // height: {totalHeight} - y - y2, backgroundColor: 'rgba(0,0,0,0)', diff --git a/src/util/symbol.js b/src/util/symbol.js index 33d419672b042260666798cb9bfd208b8ae9ec92..bfba014b85d575e5341edb96be695eef9df279d0 100644 --- a/src/util/symbol.js +++ b/src/util/symbol.js @@ -272,7 +272,7 @@ define(function(require) { if (this.type !== 'image') { var symbolStyle = this.style; var symbolShape = this.shape; - if (symbolShape.symbolType === 'line') { + if (symbolShape && symbolShape.symbolType === 'line') { symbolStyle.stroke = color; } else if (this.__isEmptyBrush) {