bkjxxxw/WebContent/static/echarts-2.2.7/build/source/chart/k.js

325 lines
14 KiB
JavaScript

define('echarts/chart/k', [
'require',
'./base',
'../util/shape/Candle',
'../component/axis',
'../component/grid',
'../component/dataZoom',
'../config',
'../util/ecData',
'zrender/tool/util',
'../chart'
], function (require) {
var ChartBase = require('./base');
var CandleShape = require('../util/shape/Candle');
require('../component/axis');
require('../component/grid');
require('../component/dataZoom');
var ecConfig = require('../config');
ecConfig.k = {
zlevel: 0,
z: 2,
clickable: true,
hoverable: true,
legendHoverLink: false,
xAxisIndex: 0,
yAxisIndex: 0,
itemStyle: {
normal: {
color: '#fff',
color0: '#00aa11',
lineStyle: {
width: 1,
color: '#ff3200',
color0: '#00aa11'
},
label: { show: false }
},
emphasis: { label: { show: false } }
}
};
var ecData = require('../util/ecData');
var zrUtil = require('zrender/tool/util');
function K(ecTheme, messageCenter, zr, option, myChart) {
ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart);
this.refresh(option);
}
K.prototype = {
type: ecConfig.CHART_TYPE_K,
_buildShape: function () {
var series = this.series;
this.selectedMap = {};
var _position2sIndexMap = {
top: [],
bottom: []
};
var xAxis;
for (var i = 0, l = series.length; i < l; i++) {
if (series[i].type === ecConfig.CHART_TYPE_K) {
series[i] = this.reformOption(series[i]);
this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink;
xAxis = this.component.xAxis.getAxis(series[i].xAxisIndex);
if (xAxis.type === ecConfig.COMPONENT_TYPE_AXIS_CATEGORY) {
_position2sIndexMap[xAxis.getPosition()].push(i);
}
}
}
for (var position in _position2sIndexMap) {
if (_position2sIndexMap[position].length > 0) {
this._buildSinglePosition(position, _position2sIndexMap[position]);
}
}
this.addShapeList();
},
_buildSinglePosition: function (position, seriesArray) {
var mapData = this._mapData(seriesArray);
var locationMap = mapData.locationMap;
var maxDataLength = mapData.maxDataLength;
if (maxDataLength === 0 || locationMap.length === 0) {
return;
}
this._buildHorizontal(seriesArray, maxDataLength, locationMap);
for (var i = 0, l = seriesArray.length; i < l; i++) {
this.buildMark(seriesArray[i]);
}
},
_mapData: function (seriesArray) {
var series = this.series;
var serie;
var serieName;
var legend = this.component.legend;
var locationMap = [];
var maxDataLength = 0;
for (var i = 0, l = seriesArray.length; i < l; i++) {
serie = series[seriesArray[i]];
serieName = serie.name;
this.selectedMap[serieName] = legend ? legend.isSelected(serieName) : true;
if (this.selectedMap[serieName]) {
locationMap.push(seriesArray[i]);
}
maxDataLength = Math.max(maxDataLength, serie.data.length);
}
return {
locationMap: locationMap,
maxDataLength: maxDataLength
};
},
_buildHorizontal: function (seriesArray, maxDataLength, locationMap) {
var series = this.series;
var seriesIndex;
var serie;
var xAxisIndex;
var categoryAxis;
var yAxisIndex;
var valueAxis;
var pointList = {};
var candleWidth;
var data;
var value;
var barMaxWidth;
for (var j = 0, k = locationMap.length; j < k; j++) {
seriesIndex = locationMap[j];
serie = series[seriesIndex];
xAxisIndex = serie.xAxisIndex || 0;
categoryAxis = this.component.xAxis.getAxis(xAxisIndex);
candleWidth = serie.barWidth || Math.floor(categoryAxis.getGap() / 2);
barMaxWidth = serie.barMaxWidth;
if (barMaxWidth && barMaxWidth < candleWidth) {
candleWidth = barMaxWidth;
}
yAxisIndex = serie.yAxisIndex || 0;
valueAxis = this.component.yAxis.getAxis(yAxisIndex);
pointList[seriesIndex] = [];
for (var i = 0, l = maxDataLength; i < l; i++) {
if (categoryAxis.getNameByIndex(i) == null) {
break;
}
data = serie.data[i];
value = this.getDataFromOption(data, '-');
if (value === '-' || value.length != 4) {
continue;
}
pointList[seriesIndex].push([
categoryAxis.getCoordByIndex(i),
candleWidth,
valueAxis.getCoord(value[0]),
valueAxis.getCoord(value[1]),
valueAxis.getCoord(value[2]),
valueAxis.getCoord(value[3]),
i,
categoryAxis.getNameByIndex(i)
]);
}
}
this._buildKLine(seriesArray, pointList);
},
_buildKLine: function (seriesArray, pointList) {
var series = this.series;
var nLineWidth;
var nLineColor;
var nLineColor0;
var nColor;
var nColor0;
var eLineWidth;
var eLineColor;
var eLineColor0;
var eColor;
var eColor0;
var serie;
var queryTarget;
var data;
var seriesPL;
var singlePoint;
var candleType;
var seriesIndex;
for (var sIdx = 0, len = seriesArray.length; sIdx < len; sIdx++) {
seriesIndex = seriesArray[sIdx];
serie = series[seriesIndex];
seriesPL = pointList[seriesIndex];
if (this._isLarge(seriesPL)) {
seriesPL = this._getLargePointList(seriesPL);
}
if (serie.type === ecConfig.CHART_TYPE_K && seriesPL != null) {
queryTarget = serie;
nLineWidth = this.query(queryTarget, 'itemStyle.normal.lineStyle.width');
nLineColor = this.query(queryTarget, 'itemStyle.normal.lineStyle.color');
nLineColor0 = this.query(queryTarget, 'itemStyle.normal.lineStyle.color0');
nColor = this.query(queryTarget, 'itemStyle.normal.color');
nColor0 = this.query(queryTarget, 'itemStyle.normal.color0');
eLineWidth = this.query(queryTarget, 'itemStyle.emphasis.lineStyle.width');
eLineColor = this.query(queryTarget, 'itemStyle.emphasis.lineStyle.color');
eLineColor0 = this.query(queryTarget, 'itemStyle.emphasis.lineStyle.color0');
eColor = this.query(queryTarget, 'itemStyle.emphasis.color');
eColor0 = this.query(queryTarget, 'itemStyle.emphasis.color0');
for (var i = 0, l = seriesPL.length; i < l; i++) {
singlePoint = seriesPL[i];
data = serie.data[singlePoint[6]];
queryTarget = data;
candleType = singlePoint[3] < singlePoint[2];
this.shapeList.push(this._getCandle(seriesIndex, singlePoint[6], singlePoint[7], singlePoint[0], singlePoint[1], singlePoint[2], singlePoint[3], singlePoint[4], singlePoint[5], candleType ? this.query(queryTarget, 'itemStyle.normal.color') || nColor : this.query(queryTarget, 'itemStyle.normal.color0') || nColor0, this.query(queryTarget, 'itemStyle.normal.lineStyle.width') || nLineWidth, candleType ? this.query(queryTarget, 'itemStyle.normal.lineStyle.color') || nLineColor : this.query(queryTarget, 'itemStyle.normal.lineStyle.color0') || nLineColor0, candleType ? this.query(queryTarget, 'itemStyle.emphasis.color') || eColor || nColor : this.query(queryTarget, 'itemStyle.emphasis.color0') || eColor0 || nColor0, this.query(queryTarget, 'itemStyle.emphasis.lineStyle.width') || eLineWidth || nLineWidth, candleType ? this.query(queryTarget, 'itemStyle.emphasis.lineStyle.color') || eLineColor || nLineColor : this.query(queryTarget, 'itemStyle.emphasis.lineStyle.color0') || eLineColor0 || nLineColor0));
}
}
}
},
_isLarge: function (singlePL) {
return singlePL[0][1] < 0.5;
},
_getLargePointList: function (singlePL) {
var total = this.component.grid.getWidth();
var len = singlePL.length;
var newList = [];
for (var i = 0; i < total; i++) {
newList[i] = singlePL[Math.floor(len / total * i)];
}
return newList;
},
_getCandle: function (seriesIndex, dataIndex, name, x, width, y0, y1, y2, y3, nColor, nLinewidth, nLineColor, eColor, eLinewidth, eLineColor) {
var series = this.series;
var serie = series[seriesIndex];
var data = serie.data[dataIndex];
var queryTarget = [
data,
serie
];
var itemShape = {
zlevel: serie.zlevel,
z: serie.z,
clickable: this.deepQuery(queryTarget, 'clickable'),
hoverable: this.deepQuery(queryTarget, 'hoverable'),
style: {
x: x,
y: [
y0,
y1,
y2,
y3
],
width: width,
color: nColor,
strokeColor: nLineColor,
lineWidth: nLinewidth,
brushType: 'both'
},
highlightStyle: {
color: eColor,
strokeColor: eLineColor,
lineWidth: eLinewidth
},
_seriesIndex: seriesIndex
};
itemShape = this.addLabel(itemShape, serie, data, name);
ecData.pack(itemShape, serie, seriesIndex, data, dataIndex, name);
itemShape = new CandleShape(itemShape);
return itemShape;
},
getMarkCoord: function (seriesIndex, mpData) {
var serie = this.series[seriesIndex];
var xAxis = this.component.xAxis.getAxis(serie.xAxisIndex);
var yAxis = this.component.yAxis.getAxis(serie.yAxisIndex);
return [
typeof mpData.xAxis != 'string' && xAxis.getCoordByIndex ? xAxis.getCoordByIndex(mpData.xAxis || 0) : xAxis.getCoord(mpData.xAxis || 0),
typeof mpData.yAxis != 'string' && yAxis.getCoordByIndex ? yAxis.getCoordByIndex(mpData.yAxis || 0) : yAxis.getCoord(mpData.yAxis || 0)
];
},
refresh: function (newOption) {
if (newOption) {
this.option = newOption;
this.series = newOption.series;
}
this.backupShapeList();
this._buildShape();
},
addDataAnimation: function (params, done) {
var series = this.series;
var aniMap = {};
for (var i = 0, l = params.length; i < l; i++) {
aniMap[params[i][0]] = params[i];
}
var x;
var dx;
var y;
var serie;
var seriesIndex;
var dataIndex;
var aniCount = 0;
function animationDone() {
aniCount--;
if (aniCount === 0) {
done && done();
}
}
for (var i = 0, l = this.shapeList.length; i < l; i++) {
seriesIndex = this.shapeList[i]._seriesIndex;
if (aniMap[seriesIndex] && !aniMap[seriesIndex][3]) {
if (this.shapeList[i].type === 'candle') {
dataIndex = ecData.get(this.shapeList[i], 'dataIndex');
serie = series[seriesIndex];
if (aniMap[seriesIndex][2] && dataIndex === serie.data.length - 1) {
this.zr.delShape(this.shapeList[i].id);
continue;
} else if (!aniMap[seriesIndex][2] && dataIndex === 0) {
this.zr.delShape(this.shapeList[i].id);
continue;
}
dx = this.component.xAxis.getAxis(serie.xAxisIndex || 0).getGap();
x = aniMap[seriesIndex][2] ? dx : -dx;
y = 0;
aniCount++;
this.zr.animate(this.shapeList[i].id, '').when(this.query(this.option, 'animationDurationUpdate'), {
position: [
x,
y
]
}).done(animationDone).start();
}
}
}
if (!aniCount) {
done && done();
}
}
};
zrUtil.inherits(K, ChartBase);
require('../chart').define('k', K);
return K;
});