diff --git a/src/chart/custom.js b/src/chart/custom.js index c9f93e6aead3394d208f599a5a540a42b1c17ad8..a409fd87505aefd58b39d62dae4937208dfa200a 100644 --- a/src/chart/custom.js +++ b/src/chart/custom.js @@ -366,19 +366,17 @@ function makeRenderItem(customSeries, data, ecModel, api) { var opacity = data.getItemVisual(dataIndexInside, 'opacity'); opacity != null && (itemStyle.opacity = opacity); - if (!data.getDimensionBrief('noDefaultLabel')) { - graphicUtil.setTextStyle(itemStyle, currLabelNormalModel, null, { - autoColor: currVisualColor, - isRectText: true - }); + graphicUtil.setTextStyle(itemStyle, currLabelNormalModel, null, { + autoColor: currVisualColor, + isRectText: true + }); - itemStyle.text = currLabelNormalModel.getShallow('show') - ? zrUtil.retrieve2( - customSeries.getFormattedLabel(dataIndexInside, 'normal'), - getDefaultLabel(data, dataIndexInside) - ) - : null; - } + itemStyle.text = currLabelNormalModel.getShallow('show') + ? zrUtil.retrieve2( + customSeries.getFormattedLabel(dataIndexInside, 'normal'), + getDefaultLabel(data, dataIndexInside) + ) + : null; extra && zrUtil.extend(itemStyle, extra); return itemStyle; diff --git a/src/chart/funnel/FunnelView.js b/src/chart/funnel/FunnelView.js index 8eb521e3e32063a49854ba626b58ee3705b12fdb..688f487c76e4725a527489f4af3f26eb376613ea 100644 --- a/src/chart/funnel/FunnelView.js +++ b/src/chart/funnel/FunnelView.js @@ -1,6 +1,7 @@ import * as graphic from '../../util/graphic'; import * as zrUtil from 'zrender/src/core/util'; import ChartView from '../../view/Chart'; +import {getDefaultLabel} from '../helper/labelHelper'; /** * Piece of pie including Sector, Label, LabelLine @@ -133,7 +134,7 @@ funnelPieceProto._updateLabel = function (data, idx) { { labelFetcher: data.hostModel, labelDataIndex: idx, - defaultText: data.getName(idx), + defaultText: getDefaultLabel(data, idx, true), autoColor: visualColor, useInsideStyle: !!labelLayout.inside }, diff --git a/src/chart/helper/Line.js b/src/chart/helper/Line.js index 18d0e9b35dcabea69e57062b928f823488cb775a..93532b49af85a8bc59383ab3f8d2a50f1b07c662 100644 --- a/src/chart/helper/Line.js +++ b/src/chart/helper/Line.js @@ -296,23 +296,21 @@ lineProto._updateCommonStl = function (lineData, idx, seriesScope) { var label = this.childOfName('label'); var defaultLabelColor; - var defaultText; var normalText; var emphasisText; if (showLabel || hoverShowLabel) { - var rawVal = seriesModel.getRawValue(idx); - defaultText = rawVal == null - ? defaultText = lineData.getName(idx) - : isFinite(rawVal) - ? round(rawVal) - : rawVal; defaultLabelColor = visualColor || '#000'; - normalText = zrUtil.retrieve2( - seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType), - defaultText - ); + normalText = seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType); + if (normalText == null) { + var rawVal = seriesModel.getRawValue(idx); + normalText = rawVal == null + ? lineData.getName(idx) + : isFinite(rawVal) + ? round(rawVal) + : rawVal; + } emphasisText = zrUtil.retrieve2( seriesModel.getFormattedLabel(idx, 'emphasis', lineData.dataType), normalText diff --git a/src/chart/helper/Symbol.js b/src/chart/helper/Symbol.js index 43470fa08b53607f2c7d3d49bd2a0ede96bd856d..fb7919c16c6a3dc995bbe6a0c4b2e64b3ddfc6bf 100644 --- a/src/chart/helper/Symbol.js +++ b/src/chart/helper/Symbol.js @@ -260,17 +260,20 @@ symbolProto._updateCommon = function (data, idx, symbolSize, seriesScope) { var useNameLabel = seriesScope && seriesScope.useNameLabel; - if (useNameLabel || !data.getDimensionBrief('noDefaultLabel')) { - graphic.setLabelStyle( - elStyle, hoverItemStyle, labelModel, hoverLabelModel, - { - labelFetcher: seriesModel, - labelDataIndex: idx, - defaultText: useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx), - isRectText: true, - autoColor: color - } - ); + graphic.setLabelStyle( + elStyle, hoverItemStyle, labelModel, hoverLabelModel, + { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultText: getLabelDefaultText, + isRectText: true, + autoColor: color + } + ); + + // Do not execute util needed. + function getLabelDefaultText(idx, opt) { + return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx); } symbolPath.off('mouseover') diff --git a/src/chart/helper/createListFromArray.js b/src/chart/helper/createListFromArray.js index 6c76e8b09679b50f7ac62d871d7eec61d8227e7c..4002f888978fddb81fd77f49be7e5e737ce95e25 100644 --- a/src/chart/helper/createListFromArray.js +++ b/src/chart/helper/createListFromArray.js @@ -2,7 +2,7 @@ import * as zrUtil from 'zrender/src/core/util'; import List from '../../data/List'; import createDimensions from '../../data/helper/createDimensions'; import {SOURCE_FORMAT_ORIGINAL} from '../../data/helper/sourceHelper'; -import {getValueTypeByAxis} from '../../data/helper/dimensionHelper'; +import {getDimensionTypeByAxis} from '../../data/helper/dimensionHelper'; import {getDataItemValue} from '../../util/model'; import CoordinateSystem from '../../CoordinateSystem'; import {getCoordSysDefineBySeries} from '../../model/referHelper'; @@ -25,7 +25,7 @@ function createListFromArray(source, seriesModel) { var axisModel = coordSysDefine.axisMap.get(dim); if (axisModel) { var axisType = axisModel.get('type'); - dimInfo.type = getValueTypeByAxis(axisType); + dimInfo.type = getDimensionTypeByAxis(axisType); dimInfo.stackable = isStackable(axisType); } return dimInfo; diff --git a/src/chart/helper/labelHelper.js b/src/chart/helper/labelHelper.js index 2fa948876efc535f3bf806237f68365ac875d5b5..7d53379f6d0be50a28d3ab20924b4c4553f0ab53 100644 --- a/src/chart/helper/labelHelper.js +++ b/src/chart/helper/labelHelper.js @@ -1,32 +1,30 @@ -import {SOURCE_FORMAT_ORIGINAL} from '../../data/helper/sourceHelper'; - -// Get concrete dim. -function getLabelValueDim(data) { - var labelDim = data.mapDimension('label'); - - return labelDim - ? labelDim - // Only if the source is own to a series, we can use the last. - // If the source is from dataset, it probably be shared by - // different series. - : data.getProvider().getSource().sourceFormat === SOURCE_FORMAT_ORIGINAL - ? data.getDimensionBrief('lastValueType') - : null; -} - /** * @param {module:echarts/data/List} data * @param {number} dataIndex + * @return {string} label string. Not null/undefined */ -export function getDefaultLabel(data, dataIndex) { - var val = data.get(getLabelValueDim(data), dataIndex); - return (val == null || isNaN(val)) ? '' : val; -} +export function getDefaultLabel(data, dataIndex, orName) { + var labelDims = data.mapDimension('defaultedLabel', true); + var len = labelDims.length; -export function getLabelFromName(data, dataIndex) { - var labelDim = data.mapDimension('label'); - return labelDim - ? data.get(labelDim, dataIndex) - : data.getName(dataIndex); + // Simple optimization (in lots of cases, label dims length is 1) + if (len === 1) { + var val = data.get(labelDims[0], dataIndex, true); + return formatLabelValue(val); + } + else if (len) { + var vals = []; + for (var i = 0; i < labelDims.length; i++) { + var val = data.get(labelDims[i], dataIndex, true); + vals.push(formatLabelValue(val)); + } + return vals.join(', '); + } + else if (orName) { + return data.getName(dataIndex); + } } +function formatLabelValue(val) { + return (val == null || isNaN(val)) ? '' : val; +} diff --git a/src/chart/pie/PieView.js b/src/chart/pie/PieView.js index 606ba23fa10e2d0de2340dab743c2f94a0a25691..9175e0b8a27b4f0da810060d76cfb725bdfe2cf5 100644 --- a/src/chart/pie/PieView.js +++ b/src/chart/pie/PieView.js @@ -1,7 +1,7 @@ import * as zrUtil from 'zrender/src/core/util'; import * as graphic from '../../util/graphic'; import ChartView from '../../view/Chart'; -import {getLabelFromName} from '../helper/labelHelper'; +import {getDefaultLabel} from '../helper/labelHelper'; /** * @param {module:echarts/model/Series} seriesModel @@ -235,7 +235,7 @@ piePieceProto._updateLabel = function (data, idx) { { labelFetcher: data.hostModel, labelDataIndex: idx, - defaultText: getLabelFromName(data, idx), + defaultText: getDefaultLabel(data, idx, true), autoColor: visualColor, useInsideStyle: !!labelLayout.inside }, diff --git a/src/chart/themeRiver/ThemeRiverSeries.js b/src/chart/themeRiver/ThemeRiverSeries.js index 4644045c488473f504a7211688dcaf74ea51c9d0..da647168119f7ea0309fa91ac158977bd1ab89d9 100644 --- a/src/chart/themeRiver/ThemeRiverSeries.js +++ b/src/chart/themeRiver/ThemeRiverSeries.js @@ -5,7 +5,7 @@ import SeriesModel from '../../model/Series'; import createDimensions from '../../data/helper/createDimensions'; -import {getValueTypeByAxis} from '../../data/helper/dimensionHelper'; +import {getDimensionTypeByAxis} from '../../data/helper/dimensionHelper'; import List from '../../data/List'; import * as zrUtil from 'zrender/src/core/util'; import {encodeHTML} from '../../util/format'; @@ -142,7 +142,7 @@ var ThemeRiverSeries = SeriesModel.extend({ sysDimensions: [ { name: 'single', - type: getValueTypeByAxis(axisType) + type: getDimensionTypeByAxis(axisType) }, { name: 'value', diff --git a/src/data/List.js b/src/data/List.js index 4bac8ba56a4de0dc22eebabaa49ad32f565bbbee..e69abdda3fe6a8a18ddd20a0b9dd70fc0aa4796b 100644 --- a/src/data/List.js +++ b/src/data/List.js @@ -313,14 +313,6 @@ listProto.mapDimension = function (coordDim, idx) { : null; }; -/** - * @type {string} Specially, can also be 'lastValueType', 'noDefaultLabel' - * @return {*} - */ -listProto.getDimensionBrief = function (type) { - return this._dimensionsSummary.brief[type]; -}; - /** * Initialize from data * @param {Array.} data source or data or data provider. diff --git a/src/data/helper/completeDimensions.js b/src/data/helper/completeDimensions.js index c35fc776617ebdcecda4de69b539c2be30fa011a..3952b43ccea4105b68d6363979fe68978bf0768b 100644 --- a/src/data/helper/completeDimensions.js +++ b/src/data/helper/completeDimensions.js @@ -36,6 +36,7 @@ import {OTHER_DIMENSIONS} from './dimensionHelper'; * @return {Array.} [{ * name: string mandatory, * coordDim: string mandatory, + * isSysCoord: boolean True if the coord is from sys dimension. * coordDimIndex: number mandatory, * type: string optional, * tooltipName: string optional, @@ -135,6 +136,7 @@ function completeDimensions(sysDims, source, opt) { if (resultItem.name == null && sysDimItemDimsDef) { resultItem.name = resultItem.tooltipName = sysDimItemDimsDef[coordDimIndex]; } + resultItem.isSysCoord = true; // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}} sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims); }); diff --git a/src/data/helper/dimensionHelper.js b/src/data/helper/dimensionHelper.js index b1608a44211e6ab3b7c87579ef9321d7104683fd..be2bc0cad213b36d16555c613da78ce020696a4c 100644 --- a/src/data/helper/dimensionHelper.js +++ b/src/data/helper/dimensionHelper.js @@ -7,8 +7,9 @@ export var OTHER_DIMENSIONS = createHashMap([ export function summarizeDimensions(data) { var summary = {}; - var encode = summary.encode = {}; + var defaultedLabel = []; + each(data.dimensions, function (dimName) { var dimItem = data.getDimensionInfo(dimName); @@ -21,7 +22,11 @@ export function summarizeDimensions(data) { if (!encode.hasOwnProperty(coordDim)) { coordDimArr = encode[coordDim] = []; } - coordDimArr[dimItem.coordDimIndex] = dimItem.name; + coordDimArr[dimItem.coordDimIndex] = dimName; + + if (dimItem.isSysCoord && mayLabelDimType(dimItem.type)) { + defaultedLabel.push(dimName); + } } OTHER_DIMENSIONS.each(function (v, otherDim) { @@ -37,17 +42,17 @@ export function summarizeDimensions(data) { }); }); - var labelEncode = summary.encode.label; - var briefLastValueType = findTheLastValueDimensions(data); - summary.brief = { - lastValueType: briefLastValueType, - noDefaultLabel: !(labelEncode && labelEncode[0]) && briefLastValueType == null - }; + var encodeLabel = encode.label; + if (encodeLabel && encodeLabel.length) { + defaultedLabel = encode.label.slice(); + } + + encode.defaultedLabel = defaultedLabel; return summary; } -export function getValueTypeByAxis(axisType) { +export function getDimensionTypeByAxis(axisType) { return axisType === 'category' ? 'ordinal' : axisType === 'time' @@ -55,15 +60,21 @@ export function getValueTypeByAxis(axisType) { : 'float'; } -function findTheLastValueDimensions(data) { - // Get last value dim - var dimensions = data.dimensions.slice(); - var valueType; - var valueDim; - while (dimensions.length && ( - valueDim = dimensions.pop(), - valueType = data.getDimensionInfo(valueDim).type, - valueType === 'ordinal' || valueType === 'time' - )) {} // jshint ignore:line - return valueDim; +function mayLabelDimType(dimType) { + // In most cases, ordinal and time do not suitable for label. + // Ordinal info can be displayed on axis. Time is too long. + return !(dimType === 'ordinal' || dimType === 'time'); } + +// function findTheLastDimMayLabel(data) { +// // Get last value dim +// var dimensions = data.dimensions.slice(); +// var valueType; +// var valueDim; +// while (dimensions.length && ( +// valueDim = dimensions.pop(), +// valueType = data.getDimensionInfo(valueDim).type, +// valueType === 'ordinal' || valueType === 'time' +// )) {} // jshint ignore:line +// return valueDim; +// } diff --git a/src/util/graphic.js b/src/util/graphic.js index 38deebdae598601c47c60cfed1b997635b49b301..bc08a5f48d656b12feab2583c8e23356866b5a48 100644 --- a/src/util/graphic.js +++ b/src/util/graphic.js @@ -457,7 +457,7 @@ export function setHoverStyle(el, hoverStyle, opt) { * @param {module:echarts/model/Model} normalModel * @param {module:echarts/model/Model} emphasisModel * @param {Object} opt Check `opt` of `setTextStyleCommon` to find other props. - * @param {Object} [opt.defaultText] + * @param {string|Function} [opt.defaultText] * @param {module:echarts/model/Model} [opt.labelFetcher] Fetch text by * `opt.labelFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)` * @param {module:echarts/model/Model} [opt.labelDataIndex] Fetch text by @@ -487,14 +487,15 @@ export function setLabelStyle( // Consider performance, only fetch label when necessary. // If `normal.show` is `false` and `emphasis.show` is `true` and `emphasis.formatter` is not set, // label should be displayed, where text is fetched by `normal.formatter` or `opt.defaultText`. - var baseText = (showNormal || showEmphasis) - ? zrUtil.retrieve2( - labelFetcher - ? labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex) - : null, - opt.defaultText - ) - : null; + var baseText; + if (showNormal || showEmphasis) { + if (labelFetcher) { + baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex); + } + if (baseText == null) { + baseText = zrUtil.isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt) : opt.defaultText; + } + } var normalStyleText = showNormal ? baseText : null; var emphasisStyleText = showEmphasis ? zrUtil.retrieve2( diff --git a/src/util/model.js b/src/util/model.js index 12d6f28f14e136f9ba2499eaba7c04024773d347..3f30c6d8b2cfd0ba51d640c02517b0a563acae86 100644 --- a/src/util/model.js +++ b/src/util/model.js @@ -164,7 +164,7 @@ export var dataFormatMixin = { * @param {string} [dataType] * @param {number} [dimIndex] * @param {string} [labelProp='label'] - * @return {string} + * @return {string} If not formatter, return null/undefined */ getFormattedLabel: function (dataIndex, status, dataType, dimIndex, labelProp) { status = status || 'normal'; diff --git a/test/scatter.html b/test/scatter.html index 519e92229ee62995d8b1fb13eab4ce7782ef6ae4..b65a826ffda7a0c5a4663bb9a58be9bb68f0f8c1 100644 --- a/test/scatter.html +++ b/test/scatter.html @@ -95,8 +95,8 @@ { name: names[1], type: 'scatter', - label: { - emphasis: { + emphasis: { + label: { show: true, position: 'top', formatter: function (params) { @@ -108,10 +108,8 @@ return val[2] * 40; }, itemStyle: { - normal: { - color: function (params) { - return 'rgba(30, 70, 50, ' + params.value[2] + ')'; - } + color: function (params) { + return 'rgba(30, 70, 50, ' + params.value[2] + ')'; } }, data: data2 @@ -120,9 +118,7 @@ name: names[2], type: 'scatter', label: { - normal: { - show: true - } + show: true }, symbolSize: function (val) { return val[2] * 40;