|
@@ -0,0 +1,942 @@
|
|
|
+define('echarts/chart/radar', [
|
|
|
+ 'require',
|
|
|
+ './base',
|
|
|
+ 'zrender/shape/Polygon',
|
|
|
+ '../component/polar',
|
|
|
+ '../config',
|
|
|
+ '../util/ecData',
|
|
|
+ 'zrender/tool/util',
|
|
|
+ 'zrender/tool/color',
|
|
|
+ '../util/accMath',
|
|
|
+ '../chart'
|
|
|
+], function (require) {
|
|
|
+ var ChartBase = require('./base');
|
|
|
+ var PolygonShape = require('zrender/shape/Polygon');
|
|
|
+ require('../component/polar');
|
|
|
+ var ecConfig = require('../config');
|
|
|
+ ecConfig.radar = {
|
|
|
+ zlevel: 0,
|
|
|
+ z: 2,
|
|
|
+ clickable: true,
|
|
|
+ legendHoverLink: true,
|
|
|
+ polarIndex: 0,
|
|
|
+ itemStyle: {
|
|
|
+ normal: {
|
|
|
+ label: { show: false },
|
|
|
+ lineStyle: {
|
|
|
+ width: 2,
|
|
|
+ type: 'solid'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ emphasis: { label: { show: false } }
|
|
|
+ },
|
|
|
+ symbolSize: 2
|
|
|
+ };
|
|
|
+ var ecData = require('../util/ecData');
|
|
|
+ var zrUtil = require('zrender/tool/util');
|
|
|
+ var zrColor = require('zrender/tool/color');
|
|
|
+ function Radar(ecTheme, messageCenter, zr, option, myChart) {
|
|
|
+ ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart);
|
|
|
+ this.refresh(option);
|
|
|
+ }
|
|
|
+ Radar.prototype = {
|
|
|
+ type: ecConfig.CHART_TYPE_RADAR,
|
|
|
+ _buildShape: function () {
|
|
|
+ this.selectedMap = {};
|
|
|
+ this._symbol = this.option.symbolList;
|
|
|
+ this._queryTarget;
|
|
|
+ this._dropBoxList = [];
|
|
|
+ this._radarDataCounter = 0;
|
|
|
+ var series = this.series;
|
|
|
+ var legend = this.component.legend;
|
|
|
+ var serieName;
|
|
|
+ for (var i = 0, l = series.length; i < l; i++) {
|
|
|
+ if (series[i].type === ecConfig.CHART_TYPE_RADAR) {
|
|
|
+ this.serie = this.reformOption(series[i]);
|
|
|
+ this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink;
|
|
|
+ serieName = this.serie.name || '';
|
|
|
+ this.selectedMap[serieName] = legend ? legend.isSelected(serieName) : true;
|
|
|
+ if (this.selectedMap[serieName]) {
|
|
|
+ this._queryTarget = [
|
|
|
+ this.serie,
|
|
|
+ this.option
|
|
|
+ ];
|
|
|
+ if (this.deepQuery(this._queryTarget, 'calculable')) {
|
|
|
+ this._addDropBox(i);
|
|
|
+ }
|
|
|
+ this._buildSingleRadar(i);
|
|
|
+ this.buildMark(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.addShapeList();
|
|
|
+ },
|
|
|
+ _buildSingleRadar: function (index) {
|
|
|
+ var legend = this.component.legend;
|
|
|
+ var iconShape;
|
|
|
+ var data = this.serie.data;
|
|
|
+ var defaultColor;
|
|
|
+ var name;
|
|
|
+ var pointList;
|
|
|
+ var calculable = this.deepQuery(this._queryTarget, 'calculable');
|
|
|
+ for (var i = 0; i < data.length; i++) {
|
|
|
+ name = data[i].name || '';
|
|
|
+ this.selectedMap[name] = legend ? legend.isSelected(name) : true;
|
|
|
+ if (!this.selectedMap[name]) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (legend) {
|
|
|
+ defaultColor = legend.getColor(name);
|
|
|
+ iconShape = legend.getItemShape(name);
|
|
|
+ if (iconShape) {
|
|
|
+ iconShape.style.brushType = this.deepQuery([
|
|
|
+ data[i],
|
|
|
+ this.serie
|
|
|
+ ], 'itemStyle.normal.areaStyle') ? 'both' : 'stroke';
|
|
|
+ legend.setItemShape(name, iconShape);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ defaultColor = this.zr.getColor(i);
|
|
|
+ }
|
|
|
+ pointList = this._getPointList(this.serie.polarIndex, data[i]);
|
|
|
+ this._addSymbol(pointList, defaultColor, i, index, this.serie.polarIndex);
|
|
|
+ this._addDataShape(pointList, defaultColor, data[i], index, i, calculable);
|
|
|
+ this._radarDataCounter++;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _getPointList: function (polarIndex, dataArr) {
|
|
|
+ var pointList = [];
|
|
|
+ var vector;
|
|
|
+ var polar = this.component.polar;
|
|
|
+ var value;
|
|
|
+ for (var i = 0, l = dataArr.value.length; i < l; i++) {
|
|
|
+ value = this.getDataFromOption(dataArr.value[i]);
|
|
|
+ vector = value != '-' ? polar.getVector(polarIndex, i, value) : false;
|
|
|
+ if (vector) {
|
|
|
+ pointList.push(vector);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return pointList;
|
|
|
+ },
|
|
|
+ _addSymbol: function (pointList, defaultColor, dataIndex, seriesIndex, polarIndex) {
|
|
|
+ var series = this.series;
|
|
|
+ var itemShape;
|
|
|
+ var polar = this.component.polar;
|
|
|
+ for (var i = 0, l = pointList.length; i < l; i++) {
|
|
|
+ itemShape = this.getSymbolShape(this.deepMerge([
|
|
|
+ series[seriesIndex].data[dataIndex],
|
|
|
+ series[seriesIndex]
|
|
|
+ ]), seriesIndex, series[seriesIndex].data[dataIndex].value[i], i, polar.getIndicatorText(polarIndex, i), pointList[i][0], pointList[i][1], this._symbol[this._radarDataCounter % this._symbol.length], defaultColor, '#fff', 'vertical');
|
|
|
+ itemShape.zlevel = this.getZlevelBase();
|
|
|
+ itemShape.z = this.getZBase() + 1;
|
|
|
+ ecData.set(itemShape, 'data', series[seriesIndex].data[dataIndex]);
|
|
|
+ ecData.set(itemShape, 'value', series[seriesIndex].data[dataIndex].value);
|
|
|
+ ecData.set(itemShape, 'dataIndex', dataIndex);
|
|
|
+ ecData.set(itemShape, 'special', i);
|
|
|
+ this.shapeList.push(itemShape);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _addDataShape: function (pointList, defaultColor, data, seriesIndex, dataIndex, calculable) {
|
|
|
+ var series = this.series;
|
|
|
+ var queryTarget = [
|
|
|
+ data,
|
|
|
+ this.serie
|
|
|
+ ];
|
|
|
+ var nColor = this.getItemStyleColor(this.deepQuery(queryTarget, 'itemStyle.normal.color'), seriesIndex, dataIndex, data);
|
|
|
+ var nLineWidth = this.deepQuery(queryTarget, 'itemStyle.normal.lineStyle.width');
|
|
|
+ var nLineType = this.deepQuery(queryTarget, 'itemStyle.normal.lineStyle.type');
|
|
|
+ var nAreaColor = this.deepQuery(queryTarget, 'itemStyle.normal.areaStyle.color');
|
|
|
+ var nIsAreaFill = this.deepQuery(queryTarget, 'itemStyle.normal.areaStyle');
|
|
|
+ var shape = {
|
|
|
+ zlevel: this.getZlevelBase(),
|
|
|
+ z: this.getZBase(),
|
|
|
+ style: {
|
|
|
+ pointList: pointList,
|
|
|
+ brushType: nIsAreaFill ? 'both' : 'stroke',
|
|
|
+ color: nAreaColor || nColor || (typeof defaultColor === 'string' ? zrColor.alpha(defaultColor, 0.5) : defaultColor),
|
|
|
+ strokeColor: nColor || defaultColor,
|
|
|
+ lineWidth: nLineWidth,
|
|
|
+ lineType: nLineType
|
|
|
+ },
|
|
|
+ highlightStyle: {
|
|
|
+ brushType: this.deepQuery(queryTarget, 'itemStyle.emphasis.areaStyle') || nIsAreaFill ? 'both' : 'stroke',
|
|
|
+ color: this.deepQuery(queryTarget, 'itemStyle.emphasis.areaStyle.color') || nAreaColor || nColor || (typeof defaultColor === 'string' ? zrColor.alpha(defaultColor, 0.5) : defaultColor),
|
|
|
+ strokeColor: this.getItemStyleColor(this.deepQuery(queryTarget, 'itemStyle.emphasis.color'), seriesIndex, dataIndex, data) || nColor || defaultColor,
|
|
|
+ lineWidth: this.deepQuery(queryTarget, 'itemStyle.emphasis.lineStyle.width') || nLineWidth,
|
|
|
+ lineType: this.deepQuery(queryTarget, 'itemStyle.emphasis.lineStyle.type') || nLineType
|
|
|
+ }
|
|
|
+ };
|
|
|
+ ecData.pack(shape, series[seriesIndex], seriesIndex, data, dataIndex, data.name, this.component.polar.getIndicator(series[seriesIndex].polarIndex));
|
|
|
+ if (calculable) {
|
|
|
+ shape.draggable = true;
|
|
|
+ this.setCalculable(shape);
|
|
|
+ }
|
|
|
+ shape = new PolygonShape(shape);
|
|
|
+ this.shapeList.push(shape);
|
|
|
+ },
|
|
|
+ _addDropBox: function (index) {
|
|
|
+ var series = this.series;
|
|
|
+ var polarIndex = this.deepQuery(this._queryTarget, 'polarIndex');
|
|
|
+ if (!this._dropBoxList[polarIndex]) {
|
|
|
+ var shape = this.component.polar.getDropBox(polarIndex);
|
|
|
+ shape.zlevel = this.getZlevelBase();
|
|
|
+ shape.z = this.getZBase();
|
|
|
+ this.setCalculable(shape);
|
|
|
+ ecData.pack(shape, series, index, undefined, -1);
|
|
|
+ this.shapeList.push(shape);
|
|
|
+ this._dropBoxList[polarIndex] = true;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ondragend: function (param, status) {
|
|
|
+ var series = this.series;
|
|
|
+ if (!this.isDragend || !param.target) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var target = param.target;
|
|
|
+ var seriesIndex = ecData.get(target, 'seriesIndex');
|
|
|
+ var dataIndex = ecData.get(target, 'dataIndex');
|
|
|
+ this.component.legend && this.component.legend.del(series[seriesIndex].data[dataIndex].name);
|
|
|
+ series[seriesIndex].data.splice(dataIndex, 1);
|
|
|
+ status.dragOut = true;
|
|
|
+ status.needRefresh = true;
|
|
|
+ this.isDragend = false;
|
|
|
+ return;
|
|
|
+ },
|
|
|
+ ondrop: function (param, status) {
|
|
|
+ var series = this.series;
|
|
|
+ if (!this.isDrop || !param.target) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var target = param.target;
|
|
|
+ var dragged = param.dragged;
|
|
|
+ var seriesIndex = ecData.get(target, 'seriesIndex');
|
|
|
+ var dataIndex = ecData.get(target, 'dataIndex');
|
|
|
+ var data;
|
|
|
+ var legend = this.component.legend;
|
|
|
+ var value;
|
|
|
+ if (dataIndex === -1) {
|
|
|
+ data = {
|
|
|
+ value: ecData.get(dragged, 'value'),
|
|
|
+ name: ecData.get(dragged, 'name')
|
|
|
+ };
|
|
|
+ series[seriesIndex].data.push(data);
|
|
|
+ legend && legend.add(data.name, dragged.style.color || dragged.style.strokeColor);
|
|
|
+ } else {
|
|
|
+ var accMath = require('../util/accMath');
|
|
|
+ data = series[seriesIndex].data[dataIndex];
|
|
|
+ legend && legend.del(data.name);
|
|
|
+ data.name += this.option.nameConnector + ecData.get(dragged, 'name');
|
|
|
+ value = ecData.get(dragged, 'value');
|
|
|
+ for (var i = 0; i < value.length; i++) {
|
|
|
+ data.value[i] = accMath.accAdd(data.value[i], value[i]);
|
|
|
+ }
|
|
|
+ legend && legend.add(data.name, dragged.style.color || dragged.style.strokeColor);
|
|
|
+ }
|
|
|
+ status.dragIn = status.dragIn || true;
|
|
|
+ this.isDrop = false;
|
|
|
+ return;
|
|
|
+ },
|
|
|
+ refresh: function (newOption) {
|
|
|
+ if (newOption) {
|
|
|
+ this.option = newOption;
|
|
|
+ this.series = newOption.series;
|
|
|
+ }
|
|
|
+ this.backupShapeList();
|
|
|
+ this._buildShape();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ zrUtil.inherits(Radar, ChartBase);
|
|
|
+ require('../chart').define('radar', Radar);
|
|
|
+ return Radar;
|
|
|
+});define('echarts/component/polar', [
|
|
|
+ 'require',
|
|
|
+ './base',
|
|
|
+ 'zrender/shape/Text',
|
|
|
+ 'zrender/shape/Line',
|
|
|
+ 'zrender/shape/Polygon',
|
|
|
+ 'zrender/shape/Circle',
|
|
|
+ 'zrender/shape/Ring',
|
|
|
+ '../config',
|
|
|
+ 'zrender/tool/util',
|
|
|
+ '../util/coordinates',
|
|
|
+ '../util/accMath',
|
|
|
+ '../util/smartSteps',
|
|
|
+ '../component'
|
|
|
+], function (require) {
|
|
|
+ var Base = require('./base');
|
|
|
+ var TextShape = require('zrender/shape/Text');
|
|
|
+ var LineShape = require('zrender/shape/Line');
|
|
|
+ var PolygonShape = require('zrender/shape/Polygon');
|
|
|
+ var Circle = require('zrender/shape/Circle');
|
|
|
+ var Ring = require('zrender/shape/Ring');
|
|
|
+ var ecConfig = require('../config');
|
|
|
+ ecConfig.polar = {
|
|
|
+ zlevel: 0,
|
|
|
+ z: 0,
|
|
|
+ center: [
|
|
|
+ '50%',
|
|
|
+ '50%'
|
|
|
+ ],
|
|
|
+ radius: '75%',
|
|
|
+ startAngle: 90,
|
|
|
+ boundaryGap: [
|
|
|
+ 0,
|
|
|
+ 0
|
|
|
+ ],
|
|
|
+ splitNumber: 5,
|
|
|
+ name: {
|
|
|
+ show: true,
|
|
|
+ textStyle: { color: '#333' }
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ show: true,
|
|
|
+ lineStyle: {
|
|
|
+ color: '#ccc',
|
|
|
+ width: 1,
|
|
|
+ type: 'solid'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ show: false,
|
|
|
+ textStyle: { color: '#333' }
|
|
|
+ },
|
|
|
+ splitArea: {
|
|
|
+ show: true,
|
|
|
+ areaStyle: {
|
|
|
+ color: [
|
|
|
+ 'rgba(250,250,250,0.3)',
|
|
|
+ 'rgba(200,200,200,0.3)'
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ show: true,
|
|
|
+ lineStyle: {
|
|
|
+ width: 1,
|
|
|
+ color: '#ccc'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ type: 'polygon'
|
|
|
+ };
|
|
|
+ var zrUtil = require('zrender/tool/util');
|
|
|
+ var ecCoordinates = require('../util/coordinates');
|
|
|
+ function Polar(ecTheme, messageCenter, zr, option, myChart) {
|
|
|
+ Base.call(this, ecTheme, messageCenter, zr, option, myChart);
|
|
|
+ this.refresh(option);
|
|
|
+ }
|
|
|
+ Polar.prototype = {
|
|
|
+ type: ecConfig.COMPONENT_TYPE_POLAR,
|
|
|
+ _buildShape: function () {
|
|
|
+ for (var i = 0; i < this.polar.length; i++) {
|
|
|
+ this._index = i;
|
|
|
+ this.reformOption(this.polar[i]);
|
|
|
+ this._queryTarget = [
|
|
|
+ this.polar[i],
|
|
|
+ this.option
|
|
|
+ ];
|
|
|
+ this._createVector(i);
|
|
|
+ this._buildSpiderWeb(i);
|
|
|
+ this._buildText(i);
|
|
|
+ this._adjustIndicatorValue(i);
|
|
|
+ this._addAxisLabel(i);
|
|
|
+ }
|
|
|
+ for (var i = 0; i < this.shapeList.length; i++) {
|
|
|
+ this.zr.addShape(this.shapeList[i]);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _createVector: function (index) {
|
|
|
+ var item = this.polar[index];
|
|
|
+ var indicator = this.deepQuery(this._queryTarget, 'indicator');
|
|
|
+ var length = indicator.length;
|
|
|
+ var startAngle = item.startAngle;
|
|
|
+ var dStep = 2 * Math.PI / length;
|
|
|
+ var radius = this._getRadius();
|
|
|
+ var __ecIndicator = item.__ecIndicator = [];
|
|
|
+ var vector;
|
|
|
+ for (var i = 0; i < length; i++) {
|
|
|
+ vector = ecCoordinates.polar2cartesian(radius, startAngle * Math.PI / 180 + dStep * i);
|
|
|
+ __ecIndicator.push({
|
|
|
+ vector: [
|
|
|
+ vector[1],
|
|
|
+ -vector[0]
|
|
|
+ ]
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _getRadius: function () {
|
|
|
+ var item = this.polar[this._index];
|
|
|
+ return this.parsePercent(item.radius, Math.min(this.zr.getWidth(), this.zr.getHeight()) / 2);
|
|
|
+ },
|
|
|
+ _buildSpiderWeb: function (index) {
|
|
|
+ var item = this.polar[index];
|
|
|
+ var __ecIndicator = item.__ecIndicator;
|
|
|
+ var splitArea = item.splitArea;
|
|
|
+ var splitLine = item.splitLine;
|
|
|
+ var center = this.getCenter(index);
|
|
|
+ var splitNumber = item.splitNumber;
|
|
|
+ var strokeColor = splitLine.lineStyle.color;
|
|
|
+ var lineWidth = splitLine.lineStyle.width;
|
|
|
+ var show = splitLine.show;
|
|
|
+ var axisLine = this.deepQuery(this._queryTarget, 'axisLine');
|
|
|
+ this._addArea(__ecIndicator, splitNumber, center, splitArea, strokeColor, lineWidth, show);
|
|
|
+ axisLine.show && this._addLine(__ecIndicator, center, axisLine);
|
|
|
+ },
|
|
|
+ _addAxisLabel: function (index) {
|
|
|
+ var accMath = require('../util/accMath');
|
|
|
+ var item = this.polar[index];
|
|
|
+ var indicator = this.deepQuery(this._queryTarget, 'indicator');
|
|
|
+ var __ecIndicator = item.__ecIndicator;
|
|
|
+ var axisLabel;
|
|
|
+ var vector;
|
|
|
+ var style;
|
|
|
+ var newStyle;
|
|
|
+ var splitNumber = this.deepQuery(this._queryTarget, 'splitNumber');
|
|
|
+ var center = this.getCenter(index);
|
|
|
+ var vector;
|
|
|
+ var value;
|
|
|
+ var text;
|
|
|
+ var theta;
|
|
|
+ var offset;
|
|
|
+ var interval;
|
|
|
+ for (var i = 0; i < indicator.length; i++) {
|
|
|
+ axisLabel = this.deepQuery([
|
|
|
+ indicator[i],
|
|
|
+ item,
|
|
|
+ this.option
|
|
|
+ ], 'axisLabel');
|
|
|
+ if (axisLabel.show) {
|
|
|
+ var textStyle = this.deepQuery([
|
|
|
+ axisLabel,
|
|
|
+ item,
|
|
|
+ this.option
|
|
|
+ ], 'textStyle');
|
|
|
+ var formatter = this.deepQuery([
|
|
|
+ axisLabel,
|
|
|
+ item
|
|
|
+ ], 'formatter');
|
|
|
+ style = {};
|
|
|
+ style.textFont = this.getFont(textStyle);
|
|
|
+ style.color = textStyle.color;
|
|
|
+ style = zrUtil.merge(style, axisLabel);
|
|
|
+ style.lineWidth = style.width;
|
|
|
+ vector = __ecIndicator[i].vector;
|
|
|
+ value = __ecIndicator[i].value;
|
|
|
+ theta = i / indicator.length * 2 * Math.PI;
|
|
|
+ offset = axisLabel.offset || 10;
|
|
|
+ interval = axisLabel.interval || 0;
|
|
|
+ if (!value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ for (var j = 1; j <= splitNumber; j += interval + 1) {
|
|
|
+ newStyle = zrUtil.merge({}, style);
|
|
|
+ text = accMath.accAdd(value.min, accMath.accMul(value.step, j));
|
|
|
+ if (typeof formatter === 'function') {
|
|
|
+ text = formatter(text);
|
|
|
+ } else if (typeof formatter === 'string') {
|
|
|
+ text = formatter.replace('{a}', '{a0}').replace('{a0}', text);
|
|
|
+ } else {
|
|
|
+ text = this.numAddCommas(text);
|
|
|
+ }
|
|
|
+ newStyle.text = text;
|
|
|
+ newStyle.x = j * vector[0] / splitNumber + Math.cos(theta) * offset + center[0];
|
|
|
+ newStyle.y = j * vector[1] / splitNumber + Math.sin(theta) * offset + center[1];
|
|
|
+ this.shapeList.push(new TextShape({
|
|
|
+ zlevel: this.getZlevelBase(),
|
|
|
+ z: this.getZBase(),
|
|
|
+ style: newStyle,
|
|
|
+ draggable: false,
|
|
|
+ hoverable: false
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _buildText: function (index) {
|
|
|
+ var item = this.polar[index];
|
|
|
+ var __ecIndicator = item.__ecIndicator;
|
|
|
+ var vector;
|
|
|
+ var indicator = this.deepQuery(this._queryTarget, 'indicator');
|
|
|
+ var center = this.getCenter(index);
|
|
|
+ var style;
|
|
|
+ var textAlign;
|
|
|
+ var name;
|
|
|
+ var rotation;
|
|
|
+ var x = 0;
|
|
|
+ var y = 0;
|
|
|
+ var margin;
|
|
|
+ var textStyle;
|
|
|
+ for (var i = 0; i < indicator.length; i++) {
|
|
|
+ name = this.deepQuery([
|
|
|
+ indicator[i],
|
|
|
+ item,
|
|
|
+ this.option
|
|
|
+ ], 'name');
|
|
|
+ if (!name.show) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ textStyle = this.deepQuery([
|
|
|
+ name,
|
|
|
+ item,
|
|
|
+ this.option
|
|
|
+ ], 'textStyle');
|
|
|
+ style = {};
|
|
|
+ style.textFont = this.getFont(textStyle);
|
|
|
+ style.color = textStyle.color;
|
|
|
+ if (typeof name.formatter == 'function') {
|
|
|
+ style.text = name.formatter.call(this.myChart, indicator[i].text, i);
|
|
|
+ } else if (typeof name.formatter == 'string') {
|
|
|
+ style.text = name.formatter.replace('{value}', indicator[i].text);
|
|
|
+ } else {
|
|
|
+ style.text = indicator[i].text;
|
|
|
+ }
|
|
|
+ __ecIndicator[i].text = style.text;
|
|
|
+ vector = __ecIndicator[i].vector;
|
|
|
+ if (Math.round(vector[0]) > 0) {
|
|
|
+ textAlign = 'left';
|
|
|
+ } else if (Math.round(vector[0]) < 0) {
|
|
|
+ textAlign = 'right';
|
|
|
+ } else {
|
|
|
+ textAlign = 'center';
|
|
|
+ }
|
|
|
+ if (name.margin == null) {
|
|
|
+ vector = this._mapVector(vector, center, 1.1);
|
|
|
+ } else {
|
|
|
+ margin = name.margin;
|
|
|
+ x = vector[0] > 0 ? margin : -margin;
|
|
|
+ y = vector[1] > 0 ? margin : -margin;
|
|
|
+ x = vector[0] === 0 ? 0 : x;
|
|
|
+ y = vector[1] === 0 ? 0 : y;
|
|
|
+ vector = this._mapVector(vector, center, 1);
|
|
|
+ }
|
|
|
+ style.textAlign = textAlign;
|
|
|
+ style.x = vector[0] + x;
|
|
|
+ style.y = vector[1] + y;
|
|
|
+ if (name.rotate) {
|
|
|
+ rotation = [
|
|
|
+ name.rotate / 180 * Math.PI,
|
|
|
+ vector[0],
|
|
|
+ vector[1]
|
|
|
+ ];
|
|
|
+ } else {
|
|
|
+ rotation = [
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ 0
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ this.shapeList.push(new TextShape({
|
|
|
+ zlevel: this.getZlevelBase(),
|
|
|
+ z: this.getZBase(),
|
|
|
+ style: style,
|
|
|
+ draggable: false,
|
|
|
+ hoverable: false,
|
|
|
+ rotation: rotation
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getIndicatorText: function (polarIndex, indicatorIndex) {
|
|
|
+ return this.polar[polarIndex] && this.polar[polarIndex].__ecIndicator[indicatorIndex] && this.polar[polarIndex].__ecIndicator[indicatorIndex].text;
|
|
|
+ },
|
|
|
+ getDropBox: function (index) {
|
|
|
+ var index = index || 0;
|
|
|
+ var item = this.polar[index];
|
|
|
+ var center = this.getCenter(index);
|
|
|
+ var __ecIndicator = item.__ecIndicator;
|
|
|
+ var len = __ecIndicator.length;
|
|
|
+ var pointList = [];
|
|
|
+ var vector;
|
|
|
+ var shape;
|
|
|
+ var type = item.type;
|
|
|
+ if (type == 'polygon') {
|
|
|
+ for (var i = 0; i < len; i++) {
|
|
|
+ vector = __ecIndicator[i].vector;
|
|
|
+ pointList.push(this._mapVector(vector, center, 1.2));
|
|
|
+ }
|
|
|
+ shape = this._getShape(pointList, 'fill', 'rgba(0,0,0,0)', '', 1);
|
|
|
+ } else if (type == 'circle') {
|
|
|
+ shape = this._getCircle('', 1, 1.2, center, 'fill', 'rgba(0,0,0,0)');
|
|
|
+ }
|
|
|
+ return shape;
|
|
|
+ },
|
|
|
+ _addArea: function (__ecIndicator, splitNumber, center, splitArea, strokeColor, lineWidth, show) {
|
|
|
+ var shape;
|
|
|
+ var scale;
|
|
|
+ var scale1;
|
|
|
+ var pointList;
|
|
|
+ var type = this.deepQuery(this._queryTarget, 'type');
|
|
|
+ for (var i = 0; i < splitNumber; i++) {
|
|
|
+ scale = (splitNumber - i) / splitNumber;
|
|
|
+ if (show) {
|
|
|
+ if (type == 'polygon') {
|
|
|
+ pointList = this._getPointList(__ecIndicator, scale, center);
|
|
|
+ shape = this._getShape(pointList, 'stroke', '', strokeColor, lineWidth);
|
|
|
+ } else if (type == 'circle') {
|
|
|
+ shape = this._getCircle(strokeColor, lineWidth, scale, center, 'stroke');
|
|
|
+ }
|
|
|
+ this.shapeList.push(shape);
|
|
|
+ }
|
|
|
+ if (splitArea.show) {
|
|
|
+ scale1 = (splitNumber - i - 1) / splitNumber;
|
|
|
+ this._addSplitArea(__ecIndicator, splitArea, scale, scale1, center, i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _getCircle: function (strokeColor, lineWidth, scale, center, brushType, color) {
|
|
|
+ var radius = this._getRadius();
|
|
|
+ return new Circle({
|
|
|
+ zlevel: this.getZlevelBase(),
|
|
|
+ z: this.getZBase(),
|
|
|
+ style: {
|
|
|
+ x: center[0],
|
|
|
+ y: center[1],
|
|
|
+ r: radius * scale,
|
|
|
+ brushType: brushType,
|
|
|
+ strokeColor: strokeColor,
|
|
|
+ lineWidth: lineWidth,
|
|
|
+ color: color
|
|
|
+ },
|
|
|
+ hoverable: false,
|
|
|
+ draggable: false
|
|
|
+ });
|
|
|
+ },
|
|
|
+ _getRing: function (color, scale0, scale1, center) {
|
|
|
+ var radius = this._getRadius();
|
|
|
+ return new Ring({
|
|
|
+ zlevel: this.getZlevelBase(),
|
|
|
+ z: this.getZBase(),
|
|
|
+ style: {
|
|
|
+ x: center[0],
|
|
|
+ y: center[1],
|
|
|
+ r: scale0 * radius,
|
|
|
+ r0: scale1 * radius,
|
|
|
+ color: color,
|
|
|
+ brushType: 'fill'
|
|
|
+ },
|
|
|
+ hoverable: false,
|
|
|
+ draggable: false
|
|
|
+ });
|
|
|
+ },
|
|
|
+ _getPointList: function (__ecIndicator, scale, center) {
|
|
|
+ var pointList = [];
|
|
|
+ var len = __ecIndicator.length;
|
|
|
+ var vector;
|
|
|
+ for (var i = 0; i < len; i++) {
|
|
|
+ vector = __ecIndicator[i].vector;
|
|
|
+ pointList.push(this._mapVector(vector, center, scale));
|
|
|
+ }
|
|
|
+ return pointList;
|
|
|
+ },
|
|
|
+ _getShape: function (pointList, brushType, color, strokeColor, lineWidth) {
|
|
|
+ return new PolygonShape({
|
|
|
+ zlevel: this.getZlevelBase(),
|
|
|
+ z: this.getZBase(),
|
|
|
+ style: {
|
|
|
+ pointList: pointList,
|
|
|
+ brushType: brushType,
|
|
|
+ color: color,
|
|
|
+ strokeColor: strokeColor,
|
|
|
+ lineWidth: lineWidth
|
|
|
+ },
|
|
|
+ hoverable: false,
|
|
|
+ draggable: false
|
|
|
+ });
|
|
|
+ },
|
|
|
+ _addSplitArea: function (__ecIndicator, splitArea, scale, scale1, center, colorInd) {
|
|
|
+ var indLen = __ecIndicator.length;
|
|
|
+ var color;
|
|
|
+ var colorArr = splitArea.areaStyle.color;
|
|
|
+ var colorLen;
|
|
|
+ var vector;
|
|
|
+ var vector1;
|
|
|
+ var pointList = [];
|
|
|
+ var indLen = __ecIndicator.length;
|
|
|
+ var shape;
|
|
|
+ var type = this.deepQuery(this._queryTarget, 'type');
|
|
|
+ if (typeof colorArr == 'string') {
|
|
|
+ colorArr = [colorArr];
|
|
|
+ }
|
|
|
+ colorLen = colorArr.length;
|
|
|
+ color = colorArr[colorInd % colorLen];
|
|
|
+ if (type == 'polygon') {
|
|
|
+ for (var i = 0; i < indLen; i++) {
|
|
|
+ pointList = [];
|
|
|
+ vector = __ecIndicator[i].vector;
|
|
|
+ vector1 = __ecIndicator[(i + 1) % indLen].vector;
|
|
|
+ pointList.push(this._mapVector(vector, center, scale));
|
|
|
+ pointList.push(this._mapVector(vector, center, scale1));
|
|
|
+ pointList.push(this._mapVector(vector1, center, scale1));
|
|
|
+ pointList.push(this._mapVector(vector1, center, scale));
|
|
|
+ shape = this._getShape(pointList, 'fill', color, '', 1);
|
|
|
+ this.shapeList.push(shape);
|
|
|
+ }
|
|
|
+ } else if (type == 'circle') {
|
|
|
+ shape = this._getRing(color, scale, scale1, center);
|
|
|
+ this.shapeList.push(shape);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _mapVector: function (vector, center, scale) {
|
|
|
+ return [
|
|
|
+ vector[0] * scale + center[0],
|
|
|
+ vector[1] * scale + center[1]
|
|
|
+ ];
|
|
|
+ },
|
|
|
+ getCenter: function (index) {
|
|
|
+ var index = index || 0;
|
|
|
+ return this.parseCenter(this.zr, this.polar[index].center);
|
|
|
+ },
|
|
|
+ _addLine: function (__ecIndicator, center, axisLine) {
|
|
|
+ var indLen = __ecIndicator.length;
|
|
|
+ var line;
|
|
|
+ var vector;
|
|
|
+ var lineStyle = axisLine.lineStyle;
|
|
|
+ var strokeColor = lineStyle.color;
|
|
|
+ var lineWidth = lineStyle.width;
|
|
|
+ var lineType = lineStyle.type;
|
|
|
+ for (var i = 0; i < indLen; i++) {
|
|
|
+ vector = __ecIndicator[i].vector;
|
|
|
+ line = this._getLine(center[0], center[1], vector[0] + center[0], vector[1] + center[1], strokeColor, lineWidth, lineType);
|
|
|
+ this.shapeList.push(line);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _getLine: function (xStart, yStart, xEnd, yEnd, strokeColor, lineWidth, lineType) {
|
|
|
+ return new LineShape({
|
|
|
+ zlevel: this.getZlevelBase(),
|
|
|
+ z: this.getZBase(),
|
|
|
+ style: {
|
|
|
+ xStart: xStart,
|
|
|
+ yStart: yStart,
|
|
|
+ xEnd: xEnd,
|
|
|
+ yEnd: yEnd,
|
|
|
+ strokeColor: strokeColor,
|
|
|
+ lineWidth: lineWidth,
|
|
|
+ lineType: lineType
|
|
|
+ },
|
|
|
+ hoverable: false
|
|
|
+ });
|
|
|
+ },
|
|
|
+ _adjustIndicatorValue: function (index) {
|
|
|
+ var item = this.polar[index];
|
|
|
+ var indicator = this.deepQuery(this._queryTarget, 'indicator');
|
|
|
+ var len = indicator.length;
|
|
|
+ var __ecIndicator = item.__ecIndicator;
|
|
|
+ var max;
|
|
|
+ var min;
|
|
|
+ var data = this._getSeriesData(index);
|
|
|
+ var boundaryGap = item.boundaryGap;
|
|
|
+ var splitNumber = item.splitNumber;
|
|
|
+ var scale = item.scale;
|
|
|
+ var opts;
|
|
|
+ var smartSteps = require('../util/smartSteps');
|
|
|
+ for (var i = 0; i < len; i++) {
|
|
|
+ if (typeof indicator[i].max == 'number') {
|
|
|
+ max = indicator[i].max;
|
|
|
+ min = indicator[i].min || 0;
|
|
|
+ opts = {
|
|
|
+ max: max,
|
|
|
+ min: min
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ var value = this._findValue(data, i, splitNumber, boundaryGap);
|
|
|
+ min = value.min;
|
|
|
+ max = value.max;
|
|
|
+ }
|
|
|
+ if (!scale && min >= 0 && max >= 0) {
|
|
|
+ min = 0;
|
|
|
+ }
|
|
|
+ if (!scale && min <= 0 && max <= 0) {
|
|
|
+ max = 0;
|
|
|
+ }
|
|
|
+ var stepOpt = smartSteps(min, max, splitNumber, opts);
|
|
|
+ __ecIndicator[i].value = {
|
|
|
+ min: stepOpt.min,
|
|
|
+ max: stepOpt.max,
|
|
|
+ step: stepOpt.step
|
|
|
+ };
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _getSeriesData: function (index) {
|
|
|
+ var data = [];
|
|
|
+ var serie;
|
|
|
+ var serieData;
|
|
|
+ var legend = this.component.legend;
|
|
|
+ var polarIndex;
|
|
|
+ for (var i = 0; i < this.series.length; i++) {
|
|
|
+ serie = this.series[i];
|
|
|
+ if (serie.type != ecConfig.CHART_TYPE_RADAR) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ serieData = serie.data || [];
|
|
|
+ for (var j = 0; j < serieData.length; j++) {
|
|
|
+ polarIndex = this.deepQuery([
|
|
|
+ serieData[j],
|
|
|
+ serie,
|
|
|
+ this.option
|
|
|
+ ], 'polarIndex') || 0;
|
|
|
+ if (polarIndex == index && (!legend || legend.isSelected(serieData[j].name))) {
|
|
|
+ data.push(serieData[j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return data;
|
|
|
+ },
|
|
|
+ _findValue: function (data, index, splitNumber, boundaryGap) {
|
|
|
+ var max;
|
|
|
+ var min;
|
|
|
+ var one;
|
|
|
+ if (!data || data.length === 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ function _compare(item) {
|
|
|
+ (item > max || max === undefined) && (max = item);
|
|
|
+ (item < min || min === undefined) && (min = item);
|
|
|
+ }
|
|
|
+ if (data.length == 1) {
|
|
|
+ min = 0;
|
|
|
+ }
|
|
|
+ if (data.length != 1) {
|
|
|
+ for (var i = 0; i < data.length; i++) {
|
|
|
+ _compare(this.getDataFromOption(data[i].value[index]));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ one = data[0];
|
|
|
+ for (var i = 0; i < one.value.length; i++) {
|
|
|
+ _compare(this.getDataFromOption(one.value[i]));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var gap = Math.abs(max - min);
|
|
|
+ min = min - Math.abs(gap * boundaryGap[0]);
|
|
|
+ max = max + Math.abs(gap * boundaryGap[1]);
|
|
|
+ if (min === max) {
|
|
|
+ if (max === 0) {
|
|
|
+ max = 1;
|
|
|
+ } else if (max > 0) {
|
|
|
+ min = max / splitNumber;
|
|
|
+ } else {
|
|
|
+ max = max / splitNumber;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ max: max,
|
|
|
+ min: min
|
|
|
+ };
|
|
|
+ },
|
|
|
+ getVector: function (polarIndex, indicatorIndex, value) {
|
|
|
+ polarIndex = polarIndex || 0;
|
|
|
+ indicatorIndex = indicatorIndex || 0;
|
|
|
+ var __ecIndicator = this.polar[polarIndex].__ecIndicator;
|
|
|
+ if (indicatorIndex >= __ecIndicator.length) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var indicator = this.polar[polarIndex].__ecIndicator[indicatorIndex];
|
|
|
+ var center = this.getCenter(polarIndex);
|
|
|
+ var vector = indicator.vector;
|
|
|
+ var max = indicator.value.max;
|
|
|
+ var min = indicator.value.min;
|
|
|
+ var alpha;
|
|
|
+ if (typeof value == 'undefined') {
|
|
|
+ return center;
|
|
|
+ }
|
|
|
+ switch (value) {
|
|
|
+ case 'min':
|
|
|
+ value = min;
|
|
|
+ break;
|
|
|
+ case 'max':
|
|
|
+ value = max;
|
|
|
+ break;
|
|
|
+ case 'center':
|
|
|
+ value = (max + min) / 2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (max != min) {
|
|
|
+ alpha = (value - min) / (max - min);
|
|
|
+ } else {
|
|
|
+ alpha = 0.5;
|
|
|
+ }
|
|
|
+ return this._mapVector(vector, center, alpha);
|
|
|
+ },
|
|
|
+ isInside: function (vector) {
|
|
|
+ var polar = this.getNearestIndex(vector);
|
|
|
+ if (polar) {
|
|
|
+ return polar.polarIndex;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ },
|
|
|
+ getNearestIndex: function (vector) {
|
|
|
+ var item;
|
|
|
+ var center;
|
|
|
+ var radius;
|
|
|
+ var polarVector;
|
|
|
+ var startAngle;
|
|
|
+ var indicator;
|
|
|
+ var len;
|
|
|
+ var angle;
|
|
|
+ var finalAngle;
|
|
|
+ for (var i = 0; i < this.polar.length; i++) {
|
|
|
+ item = this.polar[i];
|
|
|
+ center = this.getCenter(i);
|
|
|
+ if (vector[0] == center[0] && vector[1] == center[1]) {
|
|
|
+ return {
|
|
|
+ polarIndex: i,
|
|
|
+ valueIndex: 0
|
|
|
+ };
|
|
|
+ }
|
|
|
+ radius = this._getRadius();
|
|
|
+ startAngle = item.startAngle;
|
|
|
+ indicator = item.indicator;
|
|
|
+ len = indicator.length;
|
|
|
+ angle = 2 * Math.PI / len;
|
|
|
+ polarVector = ecCoordinates.cartesian2polar(vector[0] - center[0], center[1] - vector[1]);
|
|
|
+ if (vector[0] - center[0] < 0) {
|
|
|
+ polarVector[1] += Math.PI;
|
|
|
+ }
|
|
|
+ if (polarVector[1] < 0) {
|
|
|
+ polarVector[1] += 2 * Math.PI;
|
|
|
+ }
|
|
|
+ finalAngle = polarVector[1] - startAngle / 180 * Math.PI + Math.PI * 2;
|
|
|
+ if (Math.abs(Math.cos(finalAngle % (angle / 2))) * radius > polarVector[0]) {
|
|
|
+ return {
|
|
|
+ polarIndex: i,
|
|
|
+ valueIndex: Math.floor((finalAngle + angle / 2) / angle) % len
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getIndicator: function (index) {
|
|
|
+ var index = index || 0;
|
|
|
+ return this.polar[index].indicator;
|
|
|
+ },
|
|
|
+ refresh: function (newOption) {
|
|
|
+ if (newOption) {
|
|
|
+ this.option = newOption;
|
|
|
+ this.polar = this.option.polar;
|
|
|
+ this.series = this.option.series;
|
|
|
+ }
|
|
|
+ this.clear();
|
|
|
+ this._buildShape();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ zrUtil.inherits(Polar, Base);
|
|
|
+ require('../component').define('polar', Polar);
|
|
|
+ return Polar;
|
|
|
+});define('echarts/util/coordinates', [
|
|
|
+ 'require',
|
|
|
+ 'zrender/tool/math'
|
|
|
+], function (require) {
|
|
|
+ var zrMath = require('zrender/tool/math');
|
|
|
+ function polar2cartesian(r, theta) {
|
|
|
+ return [
|
|
|
+ r * zrMath.sin(theta),
|
|
|
+ r * zrMath.cos(theta)
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ function cartesian2polar(x, y) {
|
|
|
+ return [
|
|
|
+ Math.sqrt(x * x + y * y),
|
|
|
+ Math.atan(y / x)
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ polar2cartesian: polar2cartesian,
|
|
|
+ cartesian2polar: cartesian2polar
|
|
|
+ };
|
|
|
+});
|