提交 fd771524 编写于 作者: P pah100

(1) fix #2566, fix #2589 (candlestick and boxplot support markPoint) (2)...

(1) fix #2566,  fix #2589 (candlestick and boxplot support markPoint)  (2) fix: markPoint min/max on stacked series wrong.
上级 4cc16356
......@@ -36,7 +36,7 @@ define(function (require) {
var axisList = [];
ecModel.eachSeriesByType('boxplot', function (seriesModel) {
var baseAxis = seriesModel.getBaseAxisModel().axis;
var baseAxis = seriesModel.getBaseAxis();
var idx = zrUtil.indexOf(axisList, baseAxis);
if (idx < 0) {
......
......@@ -78,7 +78,7 @@ define(function (require) {
};
function calculateCandleWidth(seriesModel, data) {
var baseAxis = seriesModel.getBaseAxisModel().axis;
var baseAxis = seriesModel.getBaseAxis();
var extent;
var bandWidth = baseAxis.type === 'category'
......
......@@ -5,6 +5,7 @@ define(function(require) {
var List = require('../../data/List');
var completeDimensions = require('../../data/helper/completeDimensions');
var WhiskerBoxDraw = require('../helper/WhiskerBoxDraw');
var zrUtil = require('zrender/core/util');
function getItemValue(item) {
return item.value == null ? item : item.value;
......@@ -81,12 +82,36 @@ define(function(require) {
return map[this.get('layout')][axisDim];
},
/**
* @override
* @param {string|number} [dataDim]
* @return {Array.<Object>} dimension info list.
*/
getCoordDimensionInfo: function (dataDim) {
var data = this.getData();
var infoList = [];
var info;
zrUtil.each(['x', 'y'], function (coordDim, index) {
var dataDims = this.getDimensionsOnAxis(coordDim);
if (dataDim != null && zrUtil.indexOf(dataDims, dataDim) >= 0) {
info = data.getDimensionInfo(dataDim);
info.name = coordDim;
}
infoList[index] = data.getDimensionInfo(dataDims[0]);
infoList[index].name = coordDim;
}, this);
return dataDim != null ? info : infoList;
},
/**
* If horizontal, base axis is x, otherwise y.
* @override
*/
getBaseAxisModel: function () {
getBaseAxis: function () {
var dim = this._baseAxisDim;
return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex'));
return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis;
}
};
......@@ -113,15 +138,6 @@ define(function(require) {
}
};
function queryDataIndex(data, payload) {
if (payload.dataIndex != null) {
return payload.dataIndex;
}
else if (payload.name != null) {
return data.indexOfName(payload.name);
}
}
return {
seriesModelMixin: seriesModelMixin,
viewMixin: viewMixin
......
......@@ -13,7 +13,8 @@ define(function (require) {
var LineDraw = require('../../chart/helper/LineDraw');
var markLineTransform = function (data, coordSys, baseAxis, valueAxis, precision, item) {
var markLineTransform = function (seriesModel, coordSys, baseAxis, valueAxis, precision, item) {
var data = seriesModel.getData();
// Special type markLine like 'min', 'max', 'average'
var mlType = item.type;
if (!zrUtil.isArray(item)
......@@ -52,8 +53,8 @@ define(function (require) {
}];
}
item = [
markerHelper.dataTransform(data, coordSys, item[0]),
markerHelper.dataTransform(data, coordSys, item[1]),
markerHelper.dataTransform(seriesModel, item[0]),
markerHelper.dataTransform(seriesModel, item[1]),
zrUtil.extend({}, item[2])
];
......@@ -138,7 +139,7 @@ define(function (require) {
}
this.group.add(lineDraw.group);
var mlData = createList(coordSys, seriesData, mlModel);
var mlData = createList(coordSys, seriesModel, mlModel);
var dims = coordSys.dimensions;
var fromData = mlData.from;
......@@ -223,10 +224,10 @@ define(function (require) {
/**
* @inner
* @param {module:echarts/coord/*} coordSys
* @param {module:echarts/data/List} seriesData
* @param {module:echarts/model/Series} seriesModel
* @param {module:echarts/model/Model} mpModel
*/
function createList(coordSys, seriesData, mlModel) {
function createList(coordSys, seriesModel, mlModel) {
// var dataDimensions = seriesData.dimensions;
// var dimensionInfosMap = zrUtil.map(
// dataDimensions, seriesData.getDimensionInfo, seriesData
......@@ -247,7 +248,7 @@ define(function (require) {
var optData = zrUtil.filter(
zrUtil.map(mlModel.get('data'), zrUtil.curry(
markLineTransform, seriesData, coordSys, baseAxis, valueAxis, precision
markLineTransform, seriesModel, coordSys, baseAxis, valueAxis, precision
)),
zrUtil.curry(markLineFilter, coordSys)
);
......
......@@ -78,7 +78,7 @@ define(function (require) {
symbolDraw = symbolDrawMap[seriesName] = new SymbolDraw();
}
var mpData = createList(coordSys, seriesData, mpModel);
var mpData = createList(coordSys, seriesModel, mpModel);
var dims = coordSys && coordSys.dimensions;
// FIXME
......@@ -138,21 +138,20 @@ define(function (require) {
/**
* @inner
* @param {module:echarts/coord/*} [coordSys]
* @param {module:echarts/data/List} seriesData
* @param {module:echarts/model/Series} seriesModel
* @param {module:echarts/model/Model} mpModel
*/
function createList (coordSys, seriesData, mpModel) {
function createList(coordSys, seriesModel, mpModel) {
var seriesData = seriesModel.getData();
var dataDimensions = seriesData.dimensions;
var mpData = new List(zrUtil.map(
dataDimensions, seriesData.getDimensionInfo, seriesData
), mpModel);
var mpData = new List(seriesModel.getCoordDimensionInfo(), mpModel);
if (coordSys) {
mpData.initData(
zrUtil.filter(
zrUtil.map(mpModel.get('data'), zrUtil.curry(
markerHelper.dataTransform, seriesData, coordSys
markerHelper.dataTransform, seriesModel
)),
zrUtil.curry(markerHelper.dataFilter, coordSys)
),
......@@ -163,4 +162,5 @@ define(function (require) {
return mpData;
}
});
\ No newline at end of file
......@@ -2,6 +2,7 @@ define(function (require) {
var zrUtil = require('zrender/core/util');
var numberUtil = require('../../util/number');
var indexOf = zrUtil.indexOf;
function getPrecision(data, valueAxisDim, dataIndex) {
var precision = -1;
......@@ -18,19 +19,21 @@ define(function (require) {
return precision;
}
function markerTypeCalculatorWithExtent(mlType, data, baseAxisDim, valueAxisDim, valueIndex) {
function markerTypeCalculatorWithExtent(
mlType, data, baseDataDim, valueDataDim, baseCoordIndex, valueCoordIndex
) {
var coordArr = [];
var value = mlType === 'average'
? data.getSum(valueAxisDim, true) / data.count()
: data.getDataExtent(valueAxisDim)[mlType === 'max' ? 1 : 0];
? data.getSum(valueDataDim, true) / data.count()
: data.getDataExtent(valueDataDim, true)[mlType === 'max' ? 1 : 0];
var dataIndex = data.indexOfNearest(valueAxisDim, value);
coordArr[1 - valueIndex] = data.get(baseAxisDim, dataIndex);
coordArr[valueIndex] = data.get(valueAxisDim, dataIndex, true);
var dataIndex = data.indexOfNearest(valueDataDim, value, true);
coordArr[baseCoordIndex] = data.get(baseDataDim, dataIndex, true);
coordArr[valueCoordIndex] = data.get(valueDataDim, dataIndex, true);
var precision = getPrecision(data, valueAxisDim, dataIndex);
var precision = getPrecision(data, valueDataDim, dataIndex);
if (precision >= 0) {
coordArr[valueIndex] = +coordArr[valueIndex].toFixed(precision);
coordArr[valueCoordIndex] = +coordArr[valueCoordIndex].toFixed(precision);
}
return coordArr;
......@@ -66,46 +69,55 @@ define(function (require) {
* Transform markPoint data item to format used in List by do the following
* 1. Calculate statistic like `max`, `min`, `average`
* 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array
* @param {module:echarts/data/List} data
* @param {module:echarts/model/Series} seriesModel
* @param {module:echarts/coord/*} [coordSys]
* @param {Object} item
* @return {Object}
*/
var dataTransform = function (data, coordSys, item) {
var dataTransform = function (seriesModel, item) {
var data = seriesModel.getData();
var coordSys = seriesModel.coordinateSystem;
// 1. If not specify the position with pixel directly
// 2. If `coord` is not a data array. Which uses `xAxis`, `yAxis` to specify the coord on each dimension
// 2. If `coord` is not a data array. Which uses `xAxis`,
// `yAxis` to specify the coord on each dimension
if ((isNaN(item.x) || isNaN(item.y))
&& !zrUtil.isArray(item.coord)
&& coordSys
) {
var valueAxisDim;
var baseAxisDim;
var valueAxis;
var baseAxis;
if (item.valueIndex != null) {
valueAxisDim = coordSys.dimensions[item.valueIndex];
baseAxisDim = coordSys.dimensions[1 - item.valueIndex];
valueAxis = coordSys.getAxis(valueAxisDim);
baseAxis = coordSys.getAxis(baseAxisDim);
var baseDataDim;
var valueDataDim;
var valueAxis;
if (item.valueIndex != null || item.valueDim != null) {
valueDataDim = item.valueIndex != null
? data.getDimension(item.valueIndex) : item.valueDim;
valueAxis = coordSys.getAxis(seriesModel.getCoordDimensionInfo(valueDataDim).name);
baseAxis = coordSys.getOtherAxis(valueAxis);
baseDataDim = seriesModel.getDimensionsOnAxis(baseAxis.dim)[0];
}
else {
baseAxis = coordSys.getBaseAxis();
baseAxis = seriesModel.getBaseAxis();
valueAxis = coordSys.getOtherAxis(baseAxis);
baseAxisDim = baseAxis.dim;
valueAxisDim = valueAxis.dim;
baseDataDim = seriesModel.getDimensionsOnAxis(baseAxis.dim)[0];
valueDataDim = seriesModel.getDimensionsOnAxis(valueAxis.dim)[0];
}
var valueIndex = item.valueIndex != null
? item.valueIndex
: ((valueAxisDim === 'angle' || valueAxisDim === 'x') ? 0 : 1);
// Clone the option
// Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value
item = zrUtil.extend({}, item);
item = zrUtil.clone(item);
if (item.type && markerTypeCalculator[item.type] && baseAxis && valueAxis) {
var dims = coordSys.dimensions;
var baseCoordIndex = indexOf(dims, baseAxis.dim);
var valueCoordIndex = indexOf(dims, valueAxis.dim);
item.coord = markerTypeCalculator[item.type](
data, baseAxis.dim, valueAxisDim, valueIndex
data, baseDataDim, valueDataDim, baseCoordIndex, valueCoordIndex
);
// Force to use the value of calculated value.
item.value = item.coord[valueIndex];
item.value = item.coord[valueCoordIndex];
}
else {
// FIXME Only has one of xAxis and yAxis.
......
......@@ -166,6 +166,12 @@ define(function (require) {
* @private
*/
this._rawData;
/**
* @type {Object}
* @private
*/
this._extent;
};
var listProto = List.prototype;
......@@ -191,7 +197,7 @@ define(function (require) {
* Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
*/
listProto.getDimensionInfo = function (dim) {
return this._dimensionInfos[this.getDimension(dim)];
return zrUtil.clone(this._dimensionInfos[this.getDimension(dim)]);
};
/**
......
......@@ -136,6 +136,38 @@ define(function(require) {
return [axisDim]; // Retunr axisDim default.
},
/**
* Get coordinate dimensions info.
* By default the result is the same as dimensions info of series data.
* But some series dimensions are different from coord dimensions (i.e.
* candlestick and boxplot). Override this method to handle those cases.
* @param {string|number} [dataDim]
* @return {Array.<Object>} If dataDim specified, return cooresponding
* coord dim info, otherwise return dimension
* info list. If no coordinate system, reutrn [].
*/
getCoordDimensionInfo: function (dataDim) {
var data = this.getData();
return this.coordinateSystem
? (
dataDim != null
? data.getDimensionInfo(dataDim)
: zrUtil.map(data.dimensions, data.getDimensionInfo, data)
)
: [];
},
/**
* Get base axis if has coordinate system and has axis.
* By default use coordSys.getBaseAxis();
* Can be overrided for some chart.
* @return {type} description
*/
getBaseAxis: function () {
var coordSys = this.coordinateSystem;
return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
},
// FIXME
/**
* Default tooltip formatter
......
......@@ -35,8 +35,10 @@
'echarts/component/title',
'echarts/component/legend',
'echarts/component/markLine',
'echarts/component/markPoint',
'echarts/component/grid',
'echarts/component/tooltip'
'echarts/component/tooltip',
'zrender/vml/vml'
], function (echarts, rawData, prepareBoxplotData) {
chart = echarts.init(document.getElementById('main'), null, {
......@@ -125,6 +127,48 @@
'lower: ' + param.data[4]
].join('<br/>')
}
},
markPoint: {
data: [
{
name: '某个坐标',
coord: [2, 300]
},
{
name: '某个屏幕坐标',
x: 100,
y: 200,
label: {
normal: {
show: false,
formatter: 'asdf'
},
emphasis: {
show: true,
position: 'top',
formatter: 'zxcv'
}
}
},
{
name: 'max value (default)',
type: 'max'
},
{
name: 'min value (default)',
type: 'min'
},
{
name: 'max value (dim:Q1)',
type: 'max',
valueDim: 'Q1'
},
{
name: 'average value (dim:Q1)',
type: 'average',
valueDim: 'Q1'
}
]
}
},
{
......
......@@ -33,7 +33,8 @@
'echarts/component/legend',
'echarts/component/grid',
'echarts/component/tooltip',
'echarts/component/dataZoom'
'echarts/component/dataZoom',
'echarts/component/markPoint'
], function (echarts, rawData) {
chart = echarts.init(document.getElementById('main'), null, {
......@@ -72,16 +73,6 @@
trigger: 'axis',
axisPointer: {
type: 'line'
},
formatter: function (param) {
var param = param[0];
return [
'日期:' + param.name + '<hr size=1 style="margin: 3px 0">',
'开盘:' + param.data[0] + '<br/>',
'收盘:' + param.data[1] + '<br/>',
'日最低:' + param.data[2] + '<br/>',
'日最高:' + param.data[3] + '<br/>'
].join('')
}
},
grid: {
......@@ -124,10 +115,78 @@
{
name: '上证指数',
type: 'candlestick',
data: data.values
data: data.values,
tooltip: {
formatter: function (param) {
var param = param[0];
return [
'日期:' + param.name + '<hr size=1 style="margin: 3px 0">',
'开盘:' + param.data[0] + '<br/>',
'收盘:' + param.data[1] + '<br/>',
'日最低:' + param.data[2] + '<br/>',
'日最高:' + param.data[3] + '<br/>'
].join('')
}
},
markPoint: {
data: [
{
name: '某个坐标',
coord: ['2013/5/21', 2300]
},
{
name: '某个屏幕坐标',
x: 100,
y: 200,
label: {
normal: {
show: false,
formatter: 'asdf'
},
emphasis: {
show: true,
position: 'top',
formatter: 'zxcv'
}
}
},
{
name: 'max value (default)',
type: 'max'
},
{
name: 'min value (default)',
type: 'min'
},
{
name: 'max value (dim:close)',
type: 'max',
valueDim: 'close'
},
{
name: 'average value (dim:close)',
type: 'average',
valueDim: 'close'
}
],
tooltip: {
formatter: function (param) {
return param.name + '<br>' + (param.data.coord || '');
}
}
}
}
]
});
// setTimeout(function () {
// chart.setOption({
// dataZoom: {
// startValue: '2013/1/28',
// endValue: '2013/1/30'
// }
// });
// }, 1000);
}
</script>
......
......@@ -30,7 +30,6 @@
var xAxisData = [];
var data1 = [];
var data2 = [];
var data3 = [];
for (var i = 0; i < 10; i++) {
xAxisData.push('类目' + i);
......@@ -38,9 +37,14 @@
data2.push(+Math.random().toFixed(2));
}
if (console && console.log) {
console.log(data1);
console.log(data2);
}
chart.setOption({
legend: {
data: ['line', 'line2', 'line3']
data: ['line-stack', 'line2-stack', 'line3']
},
tooltip: {
trigger: 'axis',
......@@ -62,39 +66,113 @@
// show: false
}
},
series: [{
name: 'line',
type: 'line',
stack: 'all',
symbolSize: 6,
data: data1,
series: [
{
name: 'line-stack',
type: 'line',
stack: 'all',
symbolSize: 6,
areaStyle: {normal: {}},
data: data1,
markPoint: {
data: [{
name: '最大值',
type: 'max',
value: 1
}, {
xAxis: '类目3',
yAxis: 0.5,
value: 2
}]
}
}, {
name: 'line2',
type: 'line',
stack: 'all',
symbolSize: 6,
data: data2,
markPoint: {
data: [
{
name: '最大值',
type: 'max',
value: 1
},
{
xAxis: '类目3',
yAxis: 0.5,
value: 2
}
]
}
},
{
name: 'line2-stack',
type: 'line',
stack: 'all',
symbolSize: 6,
areaStyle: {normal: {}},
data: data2,
markPoint: {
label: {
normal: {
formatter: function (param) {
return param.name + ' ' + param.value;
},
textStyle: {
color: '#000'
},
position: 'top'
}
},
data: [
{
name: '最小值stack',
type: 'min',
value: 1
},
{
name: '最大值stack',
type: 'max',
value: 1
},
{
name: '平均值stack',
type: 'average',
value: 1
}
]
}
},
{
name: 'line3',
type: 'line',
symbolSize: 6,
data: data2,
markPoint: {
data: [{
name: '最大值',
type: 'max',
value: 1
}]
markPoint: {
label: {
normal: {
formatter: function (param) {
return param.name + ' ' + param.value;
},
textStyle: {
color: '#000'
},
position: 'top'
}
},
data: [
{
name: '最小值',
type: 'min',
value: 1
},
{
name: '最大值x',
type: 'max',
value: 1
},
{
name: '最大值y',
type: 'max',
valueIndex: 0,
value: 1
},
{
name: '平均值',
type: 'average',
value: 1
}
]
}
}
}]
]
});
})
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册