123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575 |
- define('echarts/chart/gauge', [
- 'require',
- './base',
- '../util/shape/GaugePointer',
- 'zrender/shape/Text',
- 'zrender/shape/Line',
- 'zrender/shape/Rectangle',
- 'zrender/shape/Circle',
- 'zrender/shape/Sector',
- '../config',
- '../util/ecData',
- '../util/accMath',
- 'zrender/tool/util',
- '../chart'
- ], function (require) {
- var ChartBase = require('./base');
- var GaugePointerShape = require('../util/shape/GaugePointer');
- var TextShape = require('zrender/shape/Text');
- var LineShape = require('zrender/shape/Line');
- var RectangleShape = require('zrender/shape/Rectangle');
- var CircleShape = require('zrender/shape/Circle');
- var SectorShape = require('zrender/shape/Sector');
- var ecConfig = require('../config');
- ecConfig.gauge = {
- zlevel: 0,
- z: 2,
- center: [
- '50%',
- '50%'
- ],
- clickable: true,
- legendHoverLink: true,
- radius: '75%',
- startAngle: 225,
- endAngle: -45,
- min: 0,
- max: 100,
- splitNumber: 10,
- axisLine: {
- show: true,
- lineStyle: {
- color: [
- [
- 0.2,
- '#228b22'
- ],
- [
- 0.8,
- '#48b'
- ],
- [
- 1,
- '#ff4500'
- ]
- ],
- width: 30
- }
- },
- axisTick: {
- show: true,
- splitNumber: 5,
- length: 8,
- lineStyle: {
- color: '#eee',
- width: 1,
- type: 'solid'
- }
- },
- axisLabel: {
- show: true,
- textStyle: { color: 'auto' }
- },
- splitLine: {
- show: true,
- length: 30,
- lineStyle: {
- color: '#eee',
- width: 2,
- type: 'solid'
- }
- },
- pointer: {
- show: true,
- length: '80%',
- width: 8,
- color: 'auto'
- },
- title: {
- show: true,
- offsetCenter: [
- 0,
- '-40%'
- ],
- textStyle: {
- color: '#333',
- fontSize: 15
- }
- },
- detail: {
- show: true,
- backgroundColor: 'rgba(0,0,0,0)',
- borderWidth: 0,
- borderColor: '#ccc',
- width: 100,
- height: 40,
- offsetCenter: [
- 0,
- '40%'
- ],
- textStyle: {
- color: 'auto',
- fontSize: 30
- }
- }
- };
- var ecData = require('../util/ecData');
- var accMath = require('../util/accMath');
- var zrUtil = require('zrender/tool/util');
- function Gauge(ecTheme, messageCenter, zr, option, myChart) {
- ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart);
- this.refresh(option);
- }
- Gauge.prototype = {
- type: ecConfig.CHART_TYPE_GAUGE,
- _buildShape: function () {
- var series = this.series;
- this._paramsMap = {};
- for (var i = 0, l = series.length; i < l; i++) {
- if (series[i].type === ecConfig.CHART_TYPE_GAUGE) {
- series[i] = this.reformOption(series[i]);
- this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink;
- this._buildSingleGauge(i);
- this.buildMark(i);
- }
- }
- this.addShapeList();
- },
- _buildSingleGauge: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- this._paramsMap[seriesIndex] = {
- center: this.parseCenter(this.zr, serie.center),
- radius: this.parseRadius(this.zr, serie.radius),
- startAngle: serie.startAngle.toFixed(2) - 0,
- endAngle: serie.endAngle.toFixed(2) - 0
- };
- this._paramsMap[seriesIndex].totalAngle = this._paramsMap[seriesIndex].startAngle - this._paramsMap[seriesIndex].endAngle;
- this._colorMap(seriesIndex);
- this._buildAxisLine(seriesIndex);
- this._buildSplitLine(seriesIndex);
- this._buildAxisTick(seriesIndex);
- this._buildAxisLabel(seriesIndex);
- this._buildPointer(seriesIndex);
- this._buildTitle(seriesIndex);
- this._buildDetail(seriesIndex);
- },
- _buildAxisLine: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- if (!serie.axisLine.show) {
- return;
- }
- var min = serie.min;
- var total = serie.max - min;
- var params = this._paramsMap[seriesIndex];
- var center = params.center;
- var startAngle = params.startAngle;
- var totalAngle = params.totalAngle;
- var colorArray = params.colorArray;
- var lineStyle = serie.axisLine.lineStyle;
- var lineWidth = this.parsePercent(lineStyle.width, params.radius[1]);
- var r = params.radius[1];
- var r0 = r - lineWidth;
- var sectorShape;
- var lastAngle = startAngle;
- var newAngle;
- for (var i = 0, l = colorArray.length; i < l; i++) {
- newAngle = startAngle - totalAngle * (colorArray[i][0] - min) / total;
- sectorShape = this._getSector(center, r0, r, newAngle, lastAngle, colorArray[i][1], lineStyle);
- lastAngle = newAngle;
- sectorShape._animationAdd = 'r';
- ecData.set(sectorShape, 'seriesIndex', seriesIndex);
- ecData.set(sectorShape, 'dataIndex', i);
- this.shapeList.push(sectorShape);
- }
- },
- _buildSplitLine: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- if (!serie.splitLine.show) {
- return;
- }
- var params = this._paramsMap[seriesIndex];
- var splitNumber = serie.splitNumber;
- var min = serie.min;
- var total = serie.max - min;
- var splitLine = serie.splitLine;
- var length = this.parsePercent(splitLine.length, params.radius[1]);
- var lineStyle = splitLine.lineStyle;
- var color = lineStyle.color;
- var center = params.center;
- var startAngle = params.startAngle * Math.PI / 180;
- var totalAngle = params.totalAngle * Math.PI / 180;
- var r = params.radius[1];
- var r0 = r - length;
- var angle;
- var sinAngle;
- var cosAngle;
- for (var i = 0; i <= splitNumber; i++) {
- angle = startAngle - totalAngle / splitNumber * i;
- sinAngle = Math.sin(angle);
- cosAngle = Math.cos(angle);
- this.shapeList.push(new LineShape({
- zlevel: this.getZlevelBase(),
- z: this.getZBase() + 1,
- hoverable: false,
- style: {
- xStart: center[0] + cosAngle * r,
- yStart: center[1] - sinAngle * r,
- xEnd: center[0] + cosAngle * r0,
- yEnd: center[1] - sinAngle * r0,
- strokeColor: color === 'auto' ? this._getColor(seriesIndex, min + total / splitNumber * i) : color,
- lineType: lineStyle.type,
- lineWidth: lineStyle.width,
- shadowColor: lineStyle.shadowColor,
- shadowBlur: lineStyle.shadowBlur,
- shadowOffsetX: lineStyle.shadowOffsetX,
- shadowOffsetY: lineStyle.shadowOffsetY
- }
- }));
- }
- },
- _buildAxisTick: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- if (!serie.axisTick.show) {
- return;
- }
- var params = this._paramsMap[seriesIndex];
- var splitNumber = serie.splitNumber;
- var min = serie.min;
- var total = serie.max - min;
- var axisTick = serie.axisTick;
- var tickSplit = axisTick.splitNumber;
- var length = this.parsePercent(axisTick.length, params.radius[1]);
- var lineStyle = axisTick.lineStyle;
- var color = lineStyle.color;
- var center = params.center;
- var startAngle = params.startAngle * Math.PI / 180;
- var totalAngle = params.totalAngle * Math.PI / 180;
- var r = params.radius[1];
- var r0 = r - length;
- var angle;
- var sinAngle;
- var cosAngle;
- for (var i = 0, l = splitNumber * tickSplit; i <= l; i++) {
- if (i % tickSplit === 0) {
- continue;
- }
- angle = startAngle - totalAngle / l * i;
- sinAngle = Math.sin(angle);
- cosAngle = Math.cos(angle);
- this.shapeList.push(new LineShape({
- zlevel: this.getZlevelBase(),
- z: this.getZBase() + 1,
- hoverable: false,
- style: {
- xStart: center[0] + cosAngle * r,
- yStart: center[1] - sinAngle * r,
- xEnd: center[0] + cosAngle * r0,
- yEnd: center[1] - sinAngle * r0,
- strokeColor: color === 'auto' ? this._getColor(seriesIndex, min + total / l * i) : color,
- lineType: lineStyle.type,
- lineWidth: lineStyle.width,
- shadowColor: lineStyle.shadowColor,
- shadowBlur: lineStyle.shadowBlur,
- shadowOffsetX: lineStyle.shadowOffsetX,
- shadowOffsetY: lineStyle.shadowOffsetY
- }
- }));
- }
- },
- _buildAxisLabel: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- if (!serie.axisLabel.show) {
- return;
- }
- var splitNumber = serie.splitNumber;
- var min = serie.min;
- var total = serie.max - min;
- var textStyle = serie.axisLabel.textStyle;
- var textFont = this.getFont(textStyle);
- var color = textStyle.color;
- var params = this._paramsMap[seriesIndex];
- var center = params.center;
- var startAngle = params.startAngle;
- var totalAngle = params.totalAngle;
- var r0 = params.radius[1] - this.parsePercent(serie.splitLine.length, params.radius[1]) - 5;
- var angle;
- var sinAngle;
- var cosAngle;
- var value;
- for (var i = 0; i <= splitNumber; i++) {
- value = accMath.accAdd(min, accMath.accMul(accMath.accDiv(total, splitNumber), i));
- angle = startAngle - totalAngle / splitNumber * i;
- sinAngle = Math.sin(angle * Math.PI / 180);
- cosAngle = Math.cos(angle * Math.PI / 180);
- angle = (angle + 360) % 360;
- this.shapeList.push(new TextShape({
- zlevel: this.getZlevelBase(),
- z: this.getZBase() + 1,
- hoverable: false,
- style: {
- x: center[0] + cosAngle * r0,
- y: center[1] - sinAngle * r0,
- color: color === 'auto' ? this._getColor(seriesIndex, value) : color,
- text: this._getLabelText(serie.axisLabel.formatter, value),
- textAlign: angle >= 110 && angle <= 250 ? 'left' : angle <= 70 || angle >= 290 ? 'right' : 'center',
- textBaseline: angle >= 10 && angle <= 170 ? 'top' : angle >= 190 && angle <= 350 ? 'bottom' : 'middle',
- textFont: textFont,
- shadowColor: textStyle.shadowColor,
- shadowBlur: textStyle.shadowBlur,
- shadowOffsetX: textStyle.shadowOffsetX,
- shadowOffsetY: textStyle.shadowOffsetY
- }
- }));
- }
- },
- _buildPointer: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- if (!serie.pointer.show) {
- return;
- }
- var total = serie.max - serie.min;
- var pointer = serie.pointer;
- var params = this._paramsMap[seriesIndex];
- var length = this.parsePercent(pointer.length, params.radius[1]);
- var width = this.parsePercent(pointer.width, params.radius[1]);
- var center = params.center;
- var value = this._getValue(seriesIndex);
- value = value < serie.max ? value : serie.max;
- var angle = (params.startAngle - params.totalAngle / total * (value - serie.min)) * Math.PI / 180;
- var color = pointer.color === 'auto' ? this._getColor(seriesIndex, value) : pointer.color;
- var pointShape = new GaugePointerShape({
- zlevel: this.getZlevelBase(),
- z: this.getZBase() + 1,
- clickable: this.query(serie, 'clickable'),
- style: {
- x: center[0],
- y: center[1],
- r: length,
- startAngle: params.startAngle * Math.PI / 180,
- angle: angle,
- color: color,
- width: width,
- shadowColor: pointer.shadowColor,
- shadowBlur: pointer.shadowBlur,
- shadowOffsetX: pointer.shadowOffsetX,
- shadowOffsetY: pointer.shadowOffsetY
- },
- highlightStyle: {
- brushType: 'fill',
- width: width > 2 ? 2 : width / 2,
- color: '#fff'
- }
- });
- ecData.pack(pointShape, this.series[seriesIndex], seriesIndex, this.series[seriesIndex].data[0], 0, this.series[seriesIndex].data[0].name, value);
- this.shapeList.push(pointShape);
- this.shapeList.push(new CircleShape({
- zlevel: this.getZlevelBase(),
- z: this.getZBase() + 2,
- hoverable: false,
- style: {
- x: center[0],
- y: center[1],
- r: pointer.width / 2.5,
- color: '#fff'
- }
- }));
- },
- _buildTitle: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- if (!serie.title.show) {
- return;
- }
- var data = serie.data[0];
- var name = data.name != null ? data.name : '';
- if (name !== '') {
- var title = serie.title;
- var offsetCenter = title.offsetCenter;
- var textStyle = title.textStyle;
- var textColor = textStyle.color;
- var params = this._paramsMap[seriesIndex];
- var x = params.center[0] + this.parsePercent(offsetCenter[0], params.radius[1]);
- var y = params.center[1] + this.parsePercent(offsetCenter[1], params.radius[1]);
- this.shapeList.push(new TextShape({
- zlevel: this.getZlevelBase(),
- z: this.getZBase() + (Math.abs(x - params.center[0]) + Math.abs(y - params.center[1]) < textStyle.fontSize * 2 ? 2 : 1),
- hoverable: false,
- style: {
- x: x,
- y: y,
- color: textColor === 'auto' ? this._getColor(seriesIndex) : textColor,
- text: name,
- textAlign: 'center',
- textFont: this.getFont(textStyle),
- shadowColor: textStyle.shadowColor,
- shadowBlur: textStyle.shadowBlur,
- shadowOffsetX: textStyle.shadowOffsetX,
- shadowOffsetY: textStyle.shadowOffsetY
- }
- }));
- }
- },
- _buildDetail: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- if (!serie.detail.show) {
- return;
- }
- var detail = serie.detail;
- var offsetCenter = detail.offsetCenter;
- var color = detail.backgroundColor;
- var textStyle = detail.textStyle;
- var textColor = textStyle.color;
- var params = this._paramsMap[seriesIndex];
- var value = this._getValue(seriesIndex);
- var x = params.center[0] - detail.width / 2 + this.parsePercent(offsetCenter[0], params.radius[1]);
- var y = params.center[1] + this.parsePercent(offsetCenter[1], params.radius[1]);
- this.shapeList.push(new RectangleShape({
- zlevel: this.getZlevelBase(),
- z: this.getZBase() + (Math.abs(x + detail.width / 2 - params.center[0]) + Math.abs(y + detail.height / 2 - params.center[1]) < textStyle.fontSize ? 2 : 1),
- hoverable: false,
- style: {
- x: x,
- y: y,
- width: detail.width,
- height: detail.height,
- brushType: 'both',
- color: color === 'auto' ? this._getColor(seriesIndex, value) : color,
- lineWidth: detail.borderWidth,
- strokeColor: detail.borderColor,
- shadowColor: detail.shadowColor,
- shadowBlur: detail.shadowBlur,
- shadowOffsetX: detail.shadowOffsetX,
- shadowOffsetY: detail.shadowOffsetY,
- text: this._getLabelText(detail.formatter, value),
- textFont: this.getFont(textStyle),
- textPosition: 'inside',
- textColor: textColor === 'auto' ? this._getColor(seriesIndex, value) : textColor
- }
- }));
- },
- _getValue: function (seriesIndex) {
- return this.getDataFromOption(this.series[seriesIndex].data[0]);
- },
- _colorMap: function (seriesIndex) {
- var serie = this.series[seriesIndex];
- var min = serie.min;
- var total = serie.max - min;
- var color = serie.axisLine.lineStyle.color;
- if (!(color instanceof Array)) {
- color = [[
- 1,
- color
- ]];
- }
- var colorArray = [];
- for (var i = 0, l = color.length; i < l; i++) {
- colorArray.push([
- color[i][0] * total + min,
- color[i][1]
- ]);
- }
- this._paramsMap[seriesIndex].colorArray = colorArray;
- },
- _getColor: function (seriesIndex, value) {
- if (value == null) {
- value = this._getValue(seriesIndex);
- }
- var colorArray = this._paramsMap[seriesIndex].colorArray;
- for (var i = 0, l = colorArray.length; i < l; i++) {
- if (colorArray[i][0] >= value) {
- return colorArray[i][1];
- }
- }
- return colorArray[colorArray.length - 1][1];
- },
- _getSector: function (center, r0, r, startAngle, endAngle, color, lineStyle) {
- return new SectorShape({
- zlevel: this.getZlevelBase(),
- z: this.getZBase(),
- hoverable: false,
- style: {
- x: center[0],
- y: center[1],
- r0: r0,
- r: r,
- startAngle: startAngle,
- endAngle: endAngle,
- brushType: 'fill',
- color: color,
- shadowColor: lineStyle.shadowColor,
- shadowBlur: lineStyle.shadowBlur,
- shadowOffsetX: lineStyle.shadowOffsetX,
- shadowOffsetY: lineStyle.shadowOffsetY
- }
- });
- },
- _getLabelText: function (formatter, value) {
- if (formatter) {
- if (typeof formatter === 'function') {
- return formatter.call(this.myChart, value);
- } else if (typeof formatter === 'string') {
- return formatter.replace('{value}', value);
- }
- }
- return value;
- },
- refresh: function (newOption) {
- if (newOption) {
- this.option = newOption;
- this.series = newOption.series;
- }
- this.backupShapeList();
- this._buildShape();
- }
- };
- zrUtil.inherits(Gauge, ChartBase);
- require('../chart').define('gauge', Gauge);
- return Gauge;
- });define('echarts/util/shape/GaugePointer', [
- 'require',
- 'zrender/shape/Base',
- 'zrender/tool/util',
- './normalIsCover'
- ], function (require) {
- var Base = require('zrender/shape/Base');
- var zrUtil = require('zrender/tool/util');
- function GaugePointer(options) {
- Base.call(this, options);
- }
- GaugePointer.prototype = {
- type: 'gauge-pointer',
- buildPath: function (ctx, style) {
- var r = style.r;
- var width = style.width;
- var angle = style.angle;
- var x = style.x - Math.cos(angle) * width * (width >= r / 3 ? 1 : 2);
- var y = style.y + Math.sin(angle) * width * (width >= r / 3 ? 1 : 2);
- angle = style.angle - Math.PI / 2;
- ctx.moveTo(x, y);
- ctx.lineTo(style.x + Math.cos(angle) * width, style.y - Math.sin(angle) * width);
- ctx.lineTo(style.x + Math.cos(style.angle) * r, style.y - Math.sin(style.angle) * r);
- ctx.lineTo(style.x - Math.cos(angle) * width, style.y + Math.sin(angle) * width);
- ctx.lineTo(x, y);
- return;
- },
- getRect: function (style) {
- if (style.__rect) {
- return style.__rect;
- }
- var width = style.width * 2;
- var xStart = style.x;
- var yStart = style.y;
- var xEnd = xStart + Math.cos(style.angle) * style.r;
- var yEnd = yStart - Math.sin(style.angle) * style.r;
- style.__rect = {
- x: Math.min(xStart, xEnd) - width,
- y: Math.min(yStart, yEnd) - width,
- width: Math.abs(xStart - xEnd) + width,
- height: Math.abs(yStart - yEnd) + width
- };
- return style.__rect;
- },
- isCover: require('./normalIsCover')
- };
- zrUtil.inherits(GaugePointer, Base);
- return GaugePointer;
- });
|