Spaces:
Running
Running
(function webpackUniversalModuleDefinition(root, factory) { | |
if(typeof exports === 'object' && typeof module === 'object') | |
module.exports = factory(require("echarts")); | |
else if(typeof define === 'function' && define.amd) | |
define(["echarts"], factory); | |
else if(typeof exports === 'object') | |
exports["echarts-liquidfill"] = factory(require("echarts")); | |
else | |
root["echarts-liquidfill"] = factory(root["echarts"]); | |
})(self, function(__WEBPACK_EXTERNAL_MODULE_echarts_lib_echarts__) { | |
return /******/ (() => { // webpackBootstrap | |
/******/ "use strict"; | |
/******/ var __webpack_modules__ = ({ | |
/***/ "./index.js": | |
/*!******************************!*\ | |
!*** ./index.js + 6 modules ***! | |
\******************************/ | |
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { | |
// ESM COMPAT FLAG | |
__webpack_require__.r(__webpack_exports__); | |
// EXTERNAL MODULE: external "echarts" | |
var external_echarts_ = __webpack_require__("echarts/lib/echarts"); | |
;// CONCATENATED MODULE: ./src/liquidFillSeries.js | |
external_echarts_.extendSeriesModel({ | |
type: 'series.liquidFill', | |
optionUpdated: function () { | |
var option = this.option; | |
option.gridSize = Math.max(Math.floor(option.gridSize), 4); | |
}, | |
getInitialData: function (option, ecModel) { | |
var dimensions = external_echarts_.helper.createDimensions(option.data, { | |
coordDimensions: ['value'] | |
}); | |
var list = new external_echarts_.List(dimensions, this); | |
list.initData(option.data); | |
return list; | |
}, | |
defaultOption: { | |
color: ['#294D99', '#156ACF', '#1598ED', '#45BDFF'], | |
center: ['50%', '50%'], | |
radius: '50%', | |
amplitude: '8%', | |
waveLength: '80%', | |
phase: 'auto', | |
period: 'auto', | |
direction: 'right', | |
shape: 'circle', | |
waveAnimation: true, | |
animationEasing: 'linear', | |
animationEasingUpdate: 'linear', | |
animationDuration: 2000, | |
animationDurationUpdate: 1000, | |
outline: { | |
show: true, | |
borderDistance: 8, | |
itemStyle: { | |
color: 'none', | |
borderColor: '#294D99', | |
borderWidth: 8, | |
shadowBlur: 20, | |
shadowColor: 'rgba(0, 0, 0, 0.25)' | |
} | |
}, | |
backgroundStyle: { | |
color: '#E3F7FF' | |
}, | |
itemStyle: { | |
opacity: 0.95, | |
shadowBlur: 50, | |
shadowColor: 'rgba(0, 0, 0, 0.4)' | |
}, | |
label: { | |
show: true, | |
color: '#294D99', | |
insideColor: '#fff', | |
fontSize: 50, | |
fontWeight: 'bold', | |
align: 'center', | |
baseline: 'middle', | |
position: 'inside' | |
}, | |
emphasis: { | |
itemStyle: { | |
opacity: 0.8 | |
} | |
} | |
} | |
}); | |
;// CONCATENATED MODULE: ./node_modules/zrender/lib/core/util.js | |
var BUILTIN_OBJECT = { | |
'[object Function]': true, | |
'[object RegExp]': true, | |
'[object Date]': true, | |
'[object Error]': true, | |
'[object CanvasGradient]': true, | |
'[object CanvasPattern]': true, | |
'[object Image]': true, | |
'[object Canvas]': true | |
}; | |
var TYPED_ARRAY = { | |
'[object Int8Array]': true, | |
'[object Uint8Array]': true, | |
'[object Uint8ClampedArray]': true, | |
'[object Int16Array]': true, | |
'[object Uint16Array]': true, | |
'[object Int32Array]': true, | |
'[object Uint32Array]': true, | |
'[object Float32Array]': true, | |
'[object Float64Array]': true | |
}; | |
var objToString = Object.prototype.toString; | |
var arrayProto = Array.prototype; | |
var nativeForEach = arrayProto.forEach; | |
var nativeFilter = arrayProto.filter; | |
var nativeSlice = arrayProto.slice; | |
var nativeMap = arrayProto.map; | |
var ctorFunction = function () { }.constructor; | |
var protoFunction = ctorFunction ? ctorFunction.prototype : null; | |
var methods = {}; | |
function $override(name, fn) { | |
methods[name] = fn; | |
} | |
var idStart = 0x0907; | |
function guid() { | |
return idStart++; | |
} | |
function logError() { | |
var args = []; | |
for (var _i = 0; _i < arguments.length; _i++) { | |
args[_i] = arguments[_i]; | |
} | |
if (typeof console !== 'undefined') { | |
console.error.apply(console, args); | |
} | |
} | |
function clone(source) { | |
if (source == null || typeof source !== 'object') { | |
return source; | |
} | |
var result = source; | |
var typeStr = objToString.call(source); | |
if (typeStr === '[object Array]') { | |
if (!isPrimitive(source)) { | |
result = []; | |
for (var i = 0, len = source.length; i < len; i++) { | |
result[i] = clone(source[i]); | |
} | |
} | |
} | |
else if (TYPED_ARRAY[typeStr]) { | |
if (!isPrimitive(source)) { | |
var Ctor = source.constructor; | |
if (Ctor.from) { | |
result = Ctor.from(source); | |
} | |
else { | |
result = new Ctor(source.length); | |
for (var i = 0, len = source.length; i < len; i++) { | |
result[i] = clone(source[i]); | |
} | |
} | |
} | |
} | |
else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) { | |
result = {}; | |
for (var key in source) { | |
if (source.hasOwnProperty(key)) { | |
result[key] = clone(source[key]); | |
} | |
} | |
} | |
return result; | |
} | |
function merge(target, source, overwrite) { | |
if (!isObject(source) || !isObject(target)) { | |
return overwrite ? clone(source) : target; | |
} | |
for (var key in source) { | |
if (source.hasOwnProperty(key)) { | |
var targetProp = target[key]; | |
var sourceProp = source[key]; | |
if (isObject(sourceProp) | |
&& isObject(targetProp) | |
&& !isArray(sourceProp) | |
&& !isArray(targetProp) | |
&& !isDom(sourceProp) | |
&& !isDom(targetProp) | |
&& !isBuiltInObject(sourceProp) | |
&& !isBuiltInObject(targetProp) | |
&& !isPrimitive(sourceProp) | |
&& !isPrimitive(targetProp)) { | |
merge(targetProp, sourceProp, overwrite); | |
} | |
else if (overwrite || !(key in target)) { | |
target[key] = clone(source[key]); | |
} | |
} | |
} | |
return target; | |
} | |
function mergeAll(targetAndSources, overwrite) { | |
var result = targetAndSources[0]; | |
for (var i = 1, len = targetAndSources.length; i < len; i++) { | |
result = merge(result, targetAndSources[i], overwrite); | |
} | |
return result; | |
} | |
function extend(target, source) { | |
if (Object.assign) { | |
Object.assign(target, source); | |
} | |
else { | |
for (var key in source) { | |
if (source.hasOwnProperty(key)) { | |
target[key] = source[key]; | |
} | |
} | |
} | |
return target; | |
} | |
function defaults(target, source, overlay) { | |
var keysArr = keys(source); | |
for (var i = 0; i < keysArr.length; i++) { | |
var key = keysArr[i]; | |
if ((overlay ? source[key] != null : target[key] == null)) { | |
target[key] = source[key]; | |
} | |
} | |
return target; | |
} | |
var createCanvas = function () { | |
return methods.createCanvas(); | |
}; | |
methods.createCanvas = function () { | |
return document.createElement('canvas'); | |
}; | |
function indexOf(array, value) { | |
if (array) { | |
if (array.indexOf) { | |
return array.indexOf(value); | |
} | |
for (var i = 0, len = array.length; i < len; i++) { | |
if (array[i] === value) { | |
return i; | |
} | |
} | |
} | |
return -1; | |
} | |
function inherits(clazz, baseClazz) { | |
var clazzPrototype = clazz.prototype; | |
function F() { } | |
F.prototype = baseClazz.prototype; | |
clazz.prototype = new F(); | |
for (var prop in clazzPrototype) { | |
if (clazzPrototype.hasOwnProperty(prop)) { | |
clazz.prototype[prop] = clazzPrototype[prop]; | |
} | |
} | |
clazz.prototype.constructor = clazz; | |
clazz.superClass = baseClazz; | |
} | |
function mixin(target, source, override) { | |
target = 'prototype' in target ? target.prototype : target; | |
source = 'prototype' in source ? source.prototype : source; | |
if (Object.getOwnPropertyNames) { | |
var keyList = Object.getOwnPropertyNames(source); | |
for (var i = 0; i < keyList.length; i++) { | |
var key = keyList[i]; | |
if (key !== 'constructor') { | |
if ((override ? source[key] != null : target[key] == null)) { | |
target[key] = source[key]; | |
} | |
} | |
} | |
} | |
else { | |
defaults(target, source, override); | |
} | |
} | |
function isArrayLike(data) { | |
if (!data) { | |
return false; | |
} | |
if (typeof data === 'string') { | |
return false; | |
} | |
return typeof data.length === 'number'; | |
} | |
function each(arr, cb, context) { | |
if (!(arr && cb)) { | |
return; | |
} | |
if (arr.forEach && arr.forEach === nativeForEach) { | |
arr.forEach(cb, context); | |
} | |
else if (arr.length === +arr.length) { | |
for (var i = 0, len = arr.length; i < len; i++) { | |
cb.call(context, arr[i], i, arr); | |
} | |
} | |
else { | |
for (var key in arr) { | |
if (arr.hasOwnProperty(key)) { | |
cb.call(context, arr[key], key, arr); | |
} | |
} | |
} | |
} | |
function map(arr, cb, context) { | |
if (!arr) { | |
return []; | |
} | |
if (!cb) { | |
return slice(arr); | |
} | |
if (arr.map && arr.map === nativeMap) { | |
return arr.map(cb, context); | |
} | |
else { | |
var result = []; | |
for (var i = 0, len = arr.length; i < len; i++) { | |
result.push(cb.call(context, arr[i], i, arr)); | |
} | |
return result; | |
} | |
} | |
function reduce(arr, cb, memo, context) { | |
if (!(arr && cb)) { | |
return; | |
} | |
for (var i = 0, len = arr.length; i < len; i++) { | |
memo = cb.call(context, memo, arr[i], i, arr); | |
} | |
return memo; | |
} | |
function filter(arr, cb, context) { | |
if (!arr) { | |
return []; | |
} | |
if (!cb) { | |
return slice(arr); | |
} | |
if (arr.filter && arr.filter === nativeFilter) { | |
return arr.filter(cb, context); | |
} | |
else { | |
var result = []; | |
for (var i = 0, len = arr.length; i < len; i++) { | |
if (cb.call(context, arr[i], i, arr)) { | |
result.push(arr[i]); | |
} | |
} | |
return result; | |
} | |
} | |
function find(arr, cb, context) { | |
if (!(arr && cb)) { | |
return; | |
} | |
for (var i = 0, len = arr.length; i < len; i++) { | |
if (cb.call(context, arr[i], i, arr)) { | |
return arr[i]; | |
} | |
} | |
} | |
function keys(obj) { | |
if (!obj) { | |
return []; | |
} | |
if (Object.keys) { | |
return Object.keys(obj); | |
} | |
var keyList = []; | |
for (var key in obj) { | |
if (obj.hasOwnProperty(key)) { | |
keyList.push(key); | |
} | |
} | |
return keyList; | |
} | |
function bindPolyfill(func, context) { | |
var args = []; | |
for (var _i = 2; _i < arguments.length; _i++) { | |
args[_i - 2] = arguments[_i]; | |
} | |
return function () { | |
return func.apply(context, args.concat(nativeSlice.call(arguments))); | |
}; | |
} | |
var bind = (protoFunction && isFunction(protoFunction.bind)) | |
? protoFunction.call.bind(protoFunction.bind) | |
: bindPolyfill; | |
function curry(func) { | |
var args = []; | |
for (var _i = 1; _i < arguments.length; _i++) { | |
args[_i - 1] = arguments[_i]; | |
} | |
return function () { | |
return func.apply(this, args.concat(nativeSlice.call(arguments))); | |
}; | |
} | |
function isArray(value) { | |
if (Array.isArray) { | |
return Array.isArray(value); | |
} | |
return objToString.call(value) === '[object Array]'; | |
} | |
function isFunction(value) { | |
return typeof value === 'function'; | |
} | |
function isString(value) { | |
return typeof value === 'string'; | |
} | |
function isStringSafe(value) { | |
return objToString.call(value) === '[object String]'; | |
} | |
function isNumber(value) { | |
return typeof value === 'number'; | |
} | |
function isObject(value) { | |
var type = typeof value; | |
return type === 'function' || (!!value && type === 'object'); | |
} | |
function isBuiltInObject(value) { | |
return !!BUILTIN_OBJECT[objToString.call(value)]; | |
} | |
function isTypedArray(value) { | |
return !!TYPED_ARRAY[objToString.call(value)]; | |
} | |
function isDom(value) { | |
return typeof value === 'object' | |
&& typeof value.nodeType === 'number' | |
&& typeof value.ownerDocument === 'object'; | |
} | |
function isGradientObject(value) { | |
return value.colorStops != null; | |
} | |
function isPatternObject(value) { | |
return value.image != null; | |
} | |
function isRegExp(value) { | |
return objToString.call(value) === '[object RegExp]'; | |
} | |
function eqNaN(value) { | |
return value !== value; | |
} | |
function retrieve() { | |
var args = []; | |
for (var _i = 0; _i < arguments.length; _i++) { | |
args[_i] = arguments[_i]; | |
} | |
for (var i = 0, len = args.length; i < len; i++) { | |
if (args[i] != null) { | |
return args[i]; | |
} | |
} | |
} | |
function retrieve2(value0, value1) { | |
return value0 != null | |
? value0 | |
: value1; | |
} | |
function retrieve3(value0, value1, value2) { | |
return value0 != null | |
? value0 | |
: value1 != null | |
? value1 | |
: value2; | |
} | |
function slice(arr) { | |
var args = []; | |
for (var _i = 1; _i < arguments.length; _i++) { | |
args[_i - 1] = arguments[_i]; | |
} | |
return nativeSlice.apply(arr, args); | |
} | |
function normalizeCssArray(val) { | |
if (typeof (val) === 'number') { | |
return [val, val, val, val]; | |
} | |
var len = val.length; | |
if (len === 2) { | |
return [val[0], val[1], val[0], val[1]]; | |
} | |
else if (len === 3) { | |
return [val[0], val[1], val[2], val[1]]; | |
} | |
return val; | |
} | |
function assert(condition, message) { | |
if (!condition) { | |
throw new Error(message); | |
} | |
} | |
function trim(str) { | |
if (str == null) { | |
return null; | |
} | |
else if (typeof str.trim === 'function') { | |
return str.trim(); | |
} | |
else { | |
return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); | |
} | |
} | |
var primitiveKey = '__ec_primitive__'; | |
function setAsPrimitive(obj) { | |
obj[primitiveKey] = true; | |
} | |
function isPrimitive(obj) { | |
return obj[primitiveKey]; | |
} | |
var HashMap = (function () { | |
function HashMap(obj) { | |
this.data = {}; | |
var isArr = isArray(obj); | |
this.data = {}; | |
var thisMap = this; | |
(obj instanceof HashMap) | |
? obj.each(visit) | |
: (obj && each(obj, visit)); | |
function visit(value, key) { | |
isArr ? thisMap.set(value, key) : thisMap.set(key, value); | |
} | |
} | |
HashMap.prototype.get = function (key) { | |
return this.data.hasOwnProperty(key) ? this.data[key] : null; | |
}; | |
HashMap.prototype.set = function (key, value) { | |
return (this.data[key] = value); | |
}; | |
HashMap.prototype.each = function (cb, context) { | |
for (var key in this.data) { | |
if (this.data.hasOwnProperty(key)) { | |
cb.call(context, this.data[key], key); | |
} | |
} | |
}; | |
HashMap.prototype.keys = function () { | |
return keys(this.data); | |
}; | |
HashMap.prototype.removeKey = function (key) { | |
delete this.data[key]; | |
}; | |
return HashMap; | |
}()); | |
function createHashMap(obj) { | |
return new HashMap(obj); | |
} | |
function concatArray(a, b) { | |
var newArray = new a.constructor(a.length + b.length); | |
for (var i = 0; i < a.length; i++) { | |
newArray[i] = a[i]; | |
} | |
var offset = a.length; | |
for (var i = 0; i < b.length; i++) { | |
newArray[i + offset] = b[i]; | |
} | |
return newArray; | |
} | |
function createObject(proto, properties) { | |
var obj; | |
if (Object.create) { | |
obj = Object.create(proto); | |
} | |
else { | |
var StyleCtor = function () { }; | |
StyleCtor.prototype = proto; | |
obj = new StyleCtor(); | |
} | |
if (properties) { | |
extend(obj, properties); | |
} | |
return obj; | |
} | |
function hasOwn(own, prop) { | |
return own.hasOwnProperty(prop); | |
} | |
function noop() { } | |
;// CONCATENATED MODULE: ./node_modules/echarts/lib/util/number.js | |
/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
/** | |
* AUTO-GENERATED FILE. DO NOT MODIFY. | |
*/ | |
var RADIAN_EPSILON = 1e-4; | |
function _trim(str) { | |
return str.replace(/^\s+|\s+$/g, ''); | |
} | |
function linearMap(val, domain, range, clamp) { | |
var subDomain = domain[1] - domain[0]; | |
var subRange = range[1] - range[0]; | |
if (subDomain === 0) { | |
return subRange === 0 ? range[0] : (range[0] + range[1]) / 2; | |
} | |
if (clamp) { | |
if (subDomain > 0) { | |
if (val <= domain[0]) { | |
return range[0]; | |
} else if (val >= domain[1]) { | |
return range[1]; | |
} | |
} else { | |
if (val >= domain[0]) { | |
return range[0]; | |
} else if (val <= domain[1]) { | |
return range[1]; | |
} | |
} | |
} else { | |
if (val === domain[0]) { | |
return range[0]; | |
} | |
if (val === domain[1]) { | |
return range[1]; | |
} | |
} | |
return (val - domain[0]) / subDomain * subRange + range[0]; | |
} | |
function parsePercent(percent, all) { | |
switch (percent) { | |
case 'center': | |
case 'middle': | |
percent = '50%'; | |
break; | |
case 'left': | |
case 'top': | |
percent = '0%'; | |
break; | |
case 'right': | |
case 'bottom': | |
percent = '100%'; | |
break; | |
} | |
if (typeof percent === 'string') { | |
if (_trim(percent).match(/%$/)) { | |
return parseFloat(percent) / 100 * all; | |
} | |
return parseFloat(percent); | |
} | |
return percent == null ? NaN : +percent; | |
} | |
function round(x, precision, returnStr) { | |
if (precision == null) { | |
precision = 10; | |
} | |
precision = Math.min(Math.max(0, precision), 20); | |
x = (+x).toFixed(precision); | |
return returnStr ? x : +x; | |
} | |
function asc(arr) { | |
arr.sort(function (a, b) { | |
return a - b; | |
}); | |
return arr; | |
} | |
function getPrecision(val) { | |
val = +val; | |
if (isNaN(val)) { | |
return 0; | |
} | |
var e = 1; | |
var count = 0; | |
while (Math.round(val * e) / e !== val) { | |
e *= 10; | |
count++; | |
} | |
return count; | |
} | |
function getPrecisionSafe(val) { | |
var str = val.toString(); | |
var eIndex = str.indexOf('e'); | |
if (eIndex > 0) { | |
var precision = +str.slice(eIndex + 1); | |
return precision < 0 ? -precision : 0; | |
} else { | |
var dotIndex = str.indexOf('.'); | |
return dotIndex < 0 ? 0 : str.length - 1 - dotIndex; | |
} | |
} | |
function getPixelPrecision(dataExtent, pixelExtent) { | |
var log = Math.log; | |
var LN10 = Math.LN10; | |
var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); | |
var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); | |
var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20); | |
return !isFinite(precision) ? 20 : precision; | |
} | |
function getPercentWithPrecision(valueList, idx, precision) { | |
if (!valueList[idx]) { | |
return 0; | |
} | |
var sum = reduce(valueList, function (acc, val) { | |
return acc + (isNaN(val) ? 0 : val); | |
}, 0); | |
if (sum === 0) { | |
return 0; | |
} | |
var digits = Math.pow(10, precision); | |
var votesPerQuota = map(valueList, function (val) { | |
return (isNaN(val) ? 0 : val) / sum * digits * 100; | |
}); | |
var targetSeats = digits * 100; | |
var seats = map(votesPerQuota, function (votes) { | |
return Math.floor(votes); | |
}); | |
var currentSum = reduce(seats, function (acc, val) { | |
return acc + val; | |
}, 0); | |
var remainder = map(votesPerQuota, function (votes, idx) { | |
return votes - seats[idx]; | |
}); | |
while (currentSum < targetSeats) { | |
var max = Number.NEGATIVE_INFINITY; | |
var maxId = null; | |
for (var i = 0, len = remainder.length; i < len; ++i) { | |
if (remainder[i] > max) { | |
max = remainder[i]; | |
maxId = i; | |
} | |
} | |
++seats[maxId]; | |
remainder[maxId] = 0; | |
++currentSum; | |
} | |
return seats[idx] / digits; | |
} | |
var MAX_SAFE_INTEGER = 9007199254740991; | |
function remRadian(radian) { | |
var pi2 = Math.PI * 2; | |
return (radian % pi2 + pi2) % pi2; | |
} | |
function isRadianAroundZero(val) { | |
return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; | |
} | |
var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; | |
function parseDate(value) { | |
if (value instanceof Date) { | |
return value; | |
} else if (typeof value === 'string') { | |
var match = TIME_REG.exec(value); | |
if (!match) { | |
return new Date(NaN); | |
} | |
if (!match[8]) { | |
return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, +match[7] || 0); | |
} else { | |
var hour = +match[4] || 0; | |
if (match[8].toUpperCase() !== 'Z') { | |
hour -= +match[8].slice(0, 3); | |
} | |
return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, +match[7] || 0)); | |
} | |
} else if (value == null) { | |
return new Date(NaN); | |
} | |
return new Date(Math.round(value)); | |
} | |
function quantity(val) { | |
return Math.pow(10, quantityExponent(val)); | |
} | |
function quantityExponent(val) { | |
if (val === 0) { | |
return 0; | |
} | |
var exp = Math.floor(Math.log(val) / Math.LN10); | |
if (val / Math.pow(10, exp) >= 10) { | |
exp++; | |
} | |
return exp; | |
} | |
function nice(val, round) { | |
var exponent = quantityExponent(val); | |
var exp10 = Math.pow(10, exponent); | |
var f = val / exp10; | |
var nf; | |
if (round) { | |
if (f < 1.5) { | |
nf = 1; | |
} else if (f < 2.5) { | |
nf = 2; | |
} else if (f < 4) { | |
nf = 3; | |
} else if (f < 7) { | |
nf = 5; | |
} else { | |
nf = 10; | |
} | |
} else { | |
if (f < 1) { | |
nf = 1; | |
} else if (f < 2) { | |
nf = 2; | |
} else if (f < 3) { | |
nf = 3; | |
} else if (f < 5) { | |
nf = 5; | |
} else { | |
nf = 10; | |
} | |
} | |
val = nf * exp10; | |
return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val; | |
} | |
function quantile(ascArr, p) { | |
var H = (ascArr.length - 1) * p + 1; | |
var h = Math.floor(H); | |
var v = +ascArr[h - 1]; | |
var e = H - h; | |
return e ? v + e * (ascArr[h] - v) : v; | |
} | |
function reformIntervals(list) { | |
list.sort(function (a, b) { | |
return littleThan(a, b, 0) ? -1 : 1; | |
}); | |
var curr = -Infinity; | |
var currClose = 1; | |
for (var i = 0; i < list.length;) { | |
var interval = list[i].interval; | |
var close_1 = list[i].close; | |
for (var lg = 0; lg < 2; lg++) { | |
if (interval[lg] <= curr) { | |
interval[lg] = curr; | |
close_1[lg] = !lg ? 1 - currClose : 1; | |
} | |
curr = interval[lg]; | |
currClose = close_1[lg]; | |
} | |
if (interval[0] === interval[1] && close_1[0] * close_1[1] !== 1) { | |
list.splice(i, 1); | |
} else { | |
i++; | |
} | |
} | |
return list; | |
function littleThan(a, b, lg) { | |
return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1)); | |
} | |
} | |
function numericToNumber(val) { | |
var valFloat = parseFloat(val); | |
return valFloat == val && (valFloat !== 0 || typeof val !== 'string' || val.indexOf('x') <= 0) ? valFloat : NaN; | |
} | |
function isNumeric(val) { | |
return !isNaN(numericToNumber(val)); | |
} | |
function getRandomIdBase() { | |
return Math.round(Math.random() * 9); | |
} | |
function getGreatestCommonDividor(a, b) { | |
if (b === 0) { | |
return a; | |
} | |
return getGreatestCommonDividor(b, a % b); | |
} | |
function getLeastCommonMultiple(a, b) { | |
if (a == null) { | |
return b; | |
} | |
if (b == null) { | |
return a; | |
} | |
return a * b / getGreatestCommonDividor(a, b); | |
} | |
;// CONCATENATED MODULE: ./src/liquidFillShape.js | |
/* harmony default export */ const liquidFillShape = (external_echarts_.graphic.extendShape({ | |
type: 'ec-liquid-fill', | |
shape: { | |
waveLength: 0, | |
radius: 0, | |
radiusY: 0, | |
cx: 0, | |
cy: 0, | |
waterLevel: 0, | |
amplitude: 0, | |
phase: 0, | |
inverse: false | |
}, | |
buildPath: function (ctx, shape) { | |
if (shape.radiusY == null) { | |
shape.radiusY = shape.radius; | |
} | |
/** | |
* We define a sine wave having 4 waves, and make sure at least 8 curves | |
* is drawn. Otherwise, it may cause blank area for some waves when | |
* wave length is large enough. | |
*/ | |
var curves = Math.max( | |
Math.ceil(2 * shape.radius / shape.waveLength * 4) * 2, | |
8 | |
); | |
// map phase to [-Math.PI * 2, 0] | |
while (shape.phase < -Math.PI * 2) { | |
shape.phase += Math.PI * 2; | |
} | |
while (shape.phase > 0) { | |
shape.phase -= Math.PI * 2; | |
} | |
var phase = shape.phase / Math.PI / 2 * shape.waveLength; | |
var left = shape.cx - shape.radius + phase - shape.radius * 2; | |
/** | |
* top-left corner as start point | |
* | |
* draws this point | |
* | | |
* \|/ | |
* ~~~~~~~~ | |
* | | | |
* +------+ | |
*/ | |
ctx.moveTo(left, shape.waterLevel); | |
/** | |
* top wave | |
* | |
* ~~~~~~~~ <- draws this sine wave | |
* | | | |
* +------+ | |
*/ | |
var waveRight = 0; | |
for (var c = 0; c < curves; ++c) { | |
var stage = c % 4; | |
var pos = getWaterPositions(c * shape.waveLength / 4, stage, | |
shape.waveLength, shape.amplitude); | |
ctx.bezierCurveTo(pos[0][0] + left, -pos[0][1] + shape.waterLevel, | |
pos[1][0] + left, -pos[1][1] + shape.waterLevel, | |
pos[2][0] + left, -pos[2][1] + shape.waterLevel); | |
if (c === curves - 1) { | |
waveRight = pos[2][0]; | |
} | |
} | |
if (shape.inverse) { | |
/** | |
* top-right corner | |
* 2. draws this line | |
* | | |
* +------+ | |
* 3. draws this line -> | | <- 1. draws this line | |
* ~~~~~~~~ | |
*/ | |
ctx.lineTo(waveRight + left, shape.cy - shape.radiusY); | |
ctx.lineTo(left, shape.cy - shape.radiusY); | |
ctx.lineTo(left, shape.waterLevel); | |
} | |
else { | |
/** | |
* top-right corner | |
* | |
* ~~~~~~~~ | |
* 3. draws this line -> | | <- 1. draws this line | |
* +------+ | |
* ^ | |
* | | |
* 2. draws this line | |
*/ | |
ctx.lineTo(waveRight + left, shape.cy + shape.radiusY); | |
ctx.lineTo(left, shape.cy + shape.radiusY); | |
ctx.lineTo(left, shape.waterLevel); | |
} | |
ctx.closePath(); | |
} | |
})); | |
/** | |
* Using Bezier curves to fit sine wave. | |
* There is 4 control points for each curve of wave, | |
* which is at 1/4 wave length of the sine wave. | |
* | |
* The control points for a wave from (a) to (d) are a-b-c-d: | |
* c *----* d | |
* b * | |
* | | |
* ... a * .................. | |
* | |
* whose positions are a: (0, 0), b: (0.5, 0.5), c: (1, 1), d: (PI / 2, 1) | |
* | |
* @param {number} x x position of the left-most point (a) | |
* @param {number} stage 0-3, stating which part of the wave it is | |
* @param {number} waveLength wave length of the sine wave | |
* @param {number} amplitude wave amplitude | |
*/ | |
function getWaterPositions(x, stage, waveLength, amplitude) { | |
if (stage === 0) { | |
return [ | |
[x + 1 / 2 * waveLength / Math.PI / 2, amplitude / 2], | |
[x + 1 / 2 * waveLength / Math.PI, amplitude], | |
[x + waveLength / 4, amplitude] | |
]; | |
} | |
else if (stage === 1) { | |
return [ | |
[x + 1 / 2 * waveLength / Math.PI / 2 * (Math.PI - 2), | |
amplitude], | |
[x + 1 / 2 * waveLength / Math.PI / 2 * (Math.PI - 1), | |
amplitude / 2], | |
[x + waveLength / 4, 0] | |
] | |
} | |
else if (stage === 2) { | |
return [ | |
[x + 1 / 2 * waveLength / Math.PI / 2, -amplitude / 2], | |
[x + 1 / 2 * waveLength / Math.PI, -amplitude], | |
[x + waveLength / 4, -amplitude] | |
] | |
} | |
else { | |
return [ | |
[x + 1 / 2 * waveLength / Math.PI / 2 * (Math.PI - 2), | |
-amplitude], | |
[x + 1 / 2 * waveLength / Math.PI / 2 * (Math.PI - 1), | |
-amplitude / 2], | |
[x + waveLength / 4, 0] | |
] | |
} | |
} | |
;// CONCATENATED MODULE: ./src/liquidFillView.js | |
const liquidFillView_parsePercent = parsePercent; | |
external_echarts_.extendChartView({ | |
type: 'liquidFill', | |
render: function (seriesModel, ecModel, api) { | |
var group = this.group; | |
group.removeAll(); | |
var data = seriesModel.getData(); | |
var itemModel = data.getItemModel(0); | |
var center = itemModel.get('center'); | |
var radius = itemModel.get('radius'); | |
var width = api.getWidth(); | |
var height = api.getHeight(); | |
var size = Math.min(width, height); | |
// itemStyle | |
var outlineDistance = 0; | |
var outlineBorderWidth = 0; | |
var showOutline = seriesModel.get('outline.show'); | |
if (showOutline) { | |
outlineDistance = seriesModel.get('outline.borderDistance'); | |
outlineBorderWidth = liquidFillView_parsePercent( | |
seriesModel.get('outline.itemStyle.borderWidth'), size | |
); | |
} | |
var cx = liquidFillView_parsePercent(center[0], width); | |
var cy = liquidFillView_parsePercent(center[1], height); | |
var outterRadius; | |
var innerRadius; | |
var paddingRadius; | |
var isFillContainer = false; | |
var symbol = seriesModel.get('shape'); | |
if (symbol === 'container') { | |
// a shape that fully fills the container | |
isFillContainer = true; | |
outterRadius = [ | |
width / 2, | |
height / 2 | |
]; | |
innerRadius = [ | |
outterRadius[0] - outlineBorderWidth / 2, | |
outterRadius[1] - outlineBorderWidth / 2 | |
]; | |
paddingRadius = [ | |
liquidFillView_parsePercent(outlineDistance, width), | |
liquidFillView_parsePercent(outlineDistance, height) | |
]; | |
radius = [ | |
Math.max(innerRadius[0] - paddingRadius[0], 0), | |
Math.max(innerRadius[1] - paddingRadius[1], 0) | |
]; | |
} | |
else { | |
outterRadius = liquidFillView_parsePercent(radius, size) / 2; | |
innerRadius = outterRadius - outlineBorderWidth / 2; | |
paddingRadius = liquidFillView_parsePercent(outlineDistance, size); | |
radius = Math.max(innerRadius - paddingRadius, 0); | |
} | |
if (showOutline) { | |
var outline = getOutline(); | |
outline.style.lineWidth = outlineBorderWidth; | |
group.add(getOutline()); | |
} | |
var left = isFillContainer ? 0 : cx - radius; | |
var top = isFillContainer ? 0 : cy - radius; | |
var wavePath = null; | |
group.add(getBackground()); | |
// each data item for a wave | |
var oldData = this._data; | |
var waves = []; | |
data.diff(oldData) | |
.add(function (idx) { | |
var wave = getWave(idx, false); | |
var waterLevel = wave.shape.waterLevel; | |
wave.shape.waterLevel = isFillContainer ? height / 2 : radius; | |
external_echarts_.graphic.initProps(wave, { | |
shape: { | |
waterLevel: waterLevel | |
} | |
}, seriesModel); | |
wave.z2 = 2; | |
setWaveAnimation(idx, wave, null); | |
group.add(wave); | |
data.setItemGraphicEl(idx, wave); | |
waves.push(wave); | |
}) | |
.update(function (newIdx, oldIdx) { | |
var waveElement = oldData.getItemGraphicEl(oldIdx); | |
// new wave is used to calculate position, but not added | |
var newWave = getWave(newIdx, false, waveElement); | |
// changes with animation | |
var shape = {}; | |
var shapeAttrs = ['amplitude', 'cx', 'cy', 'phase', 'radius', 'radiusY', 'waterLevel', 'waveLength']; | |
for (var i = 0; i < shapeAttrs.length; ++i) { | |
var attr = shapeAttrs[i]; | |
if (newWave.shape.hasOwnProperty(attr)) { | |
shape[attr] = newWave.shape[attr]; | |
} | |
} | |
var style = {}; | |
var styleAttrs = ['fill', 'opacity', 'shadowBlur', 'shadowColor']; | |
for (var i = 0; i < styleAttrs.length; ++i) { | |
var attr = styleAttrs[i]; | |
if (newWave.style.hasOwnProperty(attr)) { | |
style[attr] = newWave.style[attr]; | |
} | |
} | |
if (isFillContainer) { | |
shape.radiusY = height / 2; | |
} | |
// changes with animation | |
external_echarts_.graphic.updateProps(waveElement, { | |
shape: shape | |
}, seriesModel); | |
waveElement.useStyle(style); | |
// instant changes | |
waveElement.position = newWave.position; | |
waveElement.setClipPath(newWave.getClipPath()); | |
waveElement.shape.inverse = newWave.inverse; | |
setWaveAnimation(newIdx, waveElement, waveElement); | |
group.add(waveElement); | |
data.setItemGraphicEl(newIdx, waveElement); | |
waves.push(waveElement); | |
}) | |
.remove(function (idx) { | |
var wave = oldData.getItemGraphicEl(idx); | |
group.remove(wave); | |
}) | |
.execute(); | |
if (itemModel.get('label.show')) { | |
group.add(getText(waves)); | |
} | |
this._data = data; | |
/** | |
* Get path for outline, background and clipping | |
* | |
* @param {number} r outter radius of shape | |
* @param {boolean|undefined} isForClipping if the shape is used | |
* for clipping | |
*/ | |
function getPath(r, isForClipping) { | |
if (symbol) { | |
// customed symbol path | |
if (symbol.indexOf('path://') === 0) { | |
var path = external_echarts_.graphic.makePath(symbol.slice(7), {}); | |
var bouding = path.getBoundingRect(); | |
var w = bouding.width; | |
var h = bouding.height; | |
if (w > h) { | |
h = r * 2 / w * h; | |
w = r * 2; | |
} | |
else { | |
w = r * 2 / h * w; | |
h = r * 2; | |
} | |
var left = isForClipping ? 0 : cx - w / 2; | |
var top = isForClipping ? 0 : cy - h / 2; | |
path = external_echarts_.graphic.makePath( | |
symbol.slice(7), | |
{}, | |
new external_echarts_.graphic.BoundingRect(left, top, w, h) | |
); | |
if (isForClipping) { | |
path.position = [-w / 2, -h / 2]; | |
} | |
return path; | |
} | |
else if (isFillContainer) { | |
// fully fill the container | |
var x = isForClipping ? -r[0] : cx - r[0]; | |
var y = isForClipping ? -r[1] : cy - r[1]; | |
return external_echarts_.helper.createSymbol( | |
'rect', x, y, r[0] * 2, r[1] * 2 | |
); | |
} | |
else { | |
var x = isForClipping ? -r : cx - r; | |
var y = isForClipping ? -r : cy - r; | |
if (symbol === 'pin') { | |
y += r; | |
} | |
else if (symbol === 'arrow') { | |
y -= r; | |
} | |
return external_echarts_.helper.createSymbol(symbol, x, y, r * 2, r * 2); | |
} | |
} | |
return new external_echarts_.graphic.Circle({ | |
shape: { | |
cx: isForClipping ? 0 : cx, | |
cy: isForClipping ? 0 : cy, | |
r: r | |
} | |
}); | |
} | |
/** | |
* Create outline | |
*/ | |
function getOutline() { | |
var outlinePath = getPath(outterRadius); | |
outlinePath.style.fill = null; | |
outlinePath.setStyle(seriesModel.getModel('outline.itemStyle') | |
.getItemStyle()); | |
return outlinePath; | |
} | |
/** | |
* Create background | |
*/ | |
function getBackground() { | |
// Seperate stroke and fill, so we can use stroke to cover the alias of clipping. | |
var strokePath = getPath(radius); | |
strokePath.setStyle(seriesModel.getModel('backgroundStyle') | |
.getItemStyle()); | |
strokePath.style.fill = null; | |
// Stroke is front of wave | |
strokePath.z2 = 5; | |
var fillPath = getPath(radius); | |
fillPath.setStyle(seriesModel.getModel('backgroundStyle') | |
.getItemStyle()); | |
fillPath.style.stroke = null; | |
var group = new external_echarts_.graphic.Group(); | |
group.add(strokePath); | |
group.add(fillPath); | |
return group; | |
} | |
/** | |
* wave shape | |
*/ | |
function getWave(idx, isInverse, oldWave) { | |
var radiusX = isFillContainer ? radius[0] : radius; | |
var radiusY = isFillContainer ? height / 2 : radius; | |
var itemModel = data.getItemModel(idx); | |
var itemStyleModel = itemModel.getModel('itemStyle'); | |
var phase = itemModel.get('phase'); | |
var amplitude = liquidFillView_parsePercent(itemModel.get('amplitude'), | |
radiusY * 2); | |
var waveLength = liquidFillView_parsePercent(itemModel.get('waveLength'), | |
radiusX * 2); | |
var value = data.get('value', idx); | |
var waterLevel = radiusY - value * radiusY * 2; | |
phase = oldWave ? oldWave.shape.phase | |
: (phase === 'auto' ? idx * Math.PI / 4 : phase); | |
var normalStyle = itemStyleModel.getItemStyle(); | |
if (!normalStyle.fill) { | |
var seriesColor = seriesModel.get('color'); | |
var id = idx % seriesColor.length; | |
normalStyle.fill = seriesColor[id]; | |
} | |
var x = radiusX * 2; | |
var wave = new liquidFillShape({ | |
shape: { | |
waveLength: waveLength, | |
radius: radiusX, | |
radiusY: radiusY, | |
cx: x, | |
cy: 0, | |
waterLevel: waterLevel, | |
amplitude: amplitude, | |
phase: phase, | |
inverse: isInverse | |
}, | |
style: normalStyle, | |
position: [cx, cy] | |
}); | |
wave.shape._waterLevel = waterLevel; | |
var hoverStyle = itemModel.getModel('emphasis.itemStyle') | |
.getItemStyle(); | |
hoverStyle.lineWidth = 0; | |
wave.ensureState('emphasis').style = hoverStyle; | |
external_echarts_.helper.enableHoverEmphasis(wave); | |
// clip out the part outside the circle | |
var clip = getPath(radius, true); | |
// set fill for clipPath, otherwise it will not trigger hover event | |
clip.setStyle({ | |
fill: 'white' | |
}); | |
wave.setClipPath(clip); | |
return wave; | |
} | |
function setWaveAnimation(idx, wave, oldWave) { | |
var itemModel = data.getItemModel(idx); | |
var maxSpeed = itemModel.get('period'); | |
var direction = itemModel.get('direction'); | |
var value = data.get('value', idx); | |
var phase = itemModel.get('phase'); | |
phase = oldWave ? oldWave.shape.phase | |
: (phase === 'auto' ? idx * Math.PI / 4 : phase); | |
var defaultSpeed = function (maxSpeed) { | |
var cnt = data.count(); | |
return cnt === 0 ? maxSpeed : maxSpeed * | |
(0.2 + (cnt - idx) / cnt * 0.8); | |
}; | |
var speed = 0; | |
if (maxSpeed === 'auto') { | |
speed = defaultSpeed(5000); | |
} | |
else { | |
speed = typeof maxSpeed === 'function' | |
? maxSpeed(value, idx) : maxSpeed; | |
} | |
// phase for moving left/right | |
var phaseOffset = 0; | |
if (direction === 'right' || direction == null) { | |
phaseOffset = Math.PI; | |
} | |
else if (direction === 'left') { | |
phaseOffset = -Math.PI; | |
} | |
else if (direction === 'none') { | |
phaseOffset = 0; | |
} | |
else { | |
console.error('Illegal direction value for liquid fill.'); | |
} | |
// wave animation of moving left/right | |
if (direction !== 'none' && itemModel.get('waveAnimation')) { | |
wave | |
.animate('shape', true) | |
.when(0, { | |
phase: phase | |
}) | |
.when(speed / 2, { | |
phase: phaseOffset + phase | |
}) | |
.when(speed, { | |
phase: phaseOffset * 2 + phase | |
}) | |
.during(function () { | |
if (wavePath) { | |
wavePath.dirty(true); | |
} | |
}) | |
.start(); | |
} | |
} | |
/** | |
* text on wave | |
*/ | |
function getText(waves) { | |
var labelModel = itemModel.getModel('label'); | |
function formatLabel() { | |
var formatted = seriesModel.getFormattedLabel(0, 'normal'); | |
var defaultVal = (data.get('value', 0) * 100); | |
var defaultLabel = data.getName(0) || seriesModel.name; | |
if (!isNaN(defaultVal)) { | |
defaultLabel = defaultVal.toFixed(0) + '%'; | |
} | |
return formatted == null ? defaultLabel : formatted; | |
} | |
var textRectOption = { | |
z2: 10, | |
shape: { | |
x: left, | |
y: top, | |
width: (isFillContainer ? radius[0] : radius) * 2, | |
height: (isFillContainer ? radius[1] : radius) * 2 | |
}, | |
style: { | |
fill: 'transparent' | |
}, | |
textConfig: { | |
position: labelModel.get('position') || 'inside' | |
}, | |
silent: true | |
}; | |
var textOption = { | |
style: { | |
text: formatLabel(), | |
textAlign: labelModel.get('align'), | |
textVerticalAlign: labelModel.get('baseline') | |
} | |
}; | |
Object.assign(textOption.style, external_echarts_.helper.createTextStyle(labelModel)); | |
var outsideTextRect = new external_echarts_.graphic.Rect(textRectOption); | |
var insideTextRect = new external_echarts_.graphic.Rect(textRectOption); | |
insideTextRect.disableLabelAnimation = true; | |
outsideTextRect.disableLabelAnimation = true; | |
var outsideText = new external_echarts_.graphic.Text(textOption); | |
var insideText = new external_echarts_.graphic.Text(textOption); | |
outsideTextRect.setTextContent(outsideText); | |
insideTextRect.setTextContent(insideText); | |
var insColor = labelModel.get('insideColor'); | |
insideText.style.fill = insColor; | |
var group = new external_echarts_.graphic.Group(); | |
group.add(outsideTextRect); | |
group.add(insideTextRect); | |
// clip out waves for insideText | |
var boundingCircle = getPath(radius, true); | |
wavePath = new external_echarts_.graphic.CompoundPath({ | |
shape: { | |
paths: waves | |
}, | |
position: [cx, cy] | |
}); | |
wavePath.setClipPath(boundingCircle); | |
insideTextRect.setClipPath(wavePath); | |
return group; | |
} | |
}, | |
dispose: function () { | |
// dispose nothing here | |
} | |
}); | |
;// CONCATENATED MODULE: ./src/liquidFill.js | |
;// CONCATENATED MODULE: ./index.js | |
/***/ }), | |
/***/ "echarts/lib/echarts": | |
/*!**************************!*\ | |
!*** external "echarts" ***! | |
\**************************/ | |
/***/ ((module) => { | |
module.exports = __WEBPACK_EXTERNAL_MODULE_echarts_lib_echarts__; | |
/***/ }) | |
/******/ }); | |
/************************************************************************/ | |
/******/ // The module cache | |
/******/ var __webpack_module_cache__ = {}; | |
/******/ | |
/******/ // The require function | |
/******/ function __webpack_require__(moduleId) { | |
/******/ // Check if module is in cache | |
/******/ if(__webpack_module_cache__[moduleId]) { | |
/******/ return __webpack_module_cache__[moduleId].exports; | |
/******/ } | |
/******/ // Create a new module (and put it into the cache) | |
/******/ var module = __webpack_module_cache__[moduleId] = { | |
/******/ // no module.id needed | |
/******/ // no module.loaded needed | |
/******/ exports: {} | |
/******/ }; | |
/******/ | |
/******/ // Execute the module function | |
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); | |
/******/ | |
/******/ // Return the exports of the module | |
/******/ return module.exports; | |
/******/ } | |
/******/ | |
/************************************************************************/ | |
/******/ /* webpack/runtime/make namespace object */ | |
/******/ (() => { | |
/******/ // define __esModule on exports | |
/******/ __webpack_require__.r = (exports) => { | |
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { | |
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | |
/******/ } | |
/******/ Object.defineProperty(exports, '__esModule', { value: true }); | |
/******/ }; | |
/******/ })(); | |
/******/ | |
/************************************************************************/ | |
/******/ // module exports must be returned from runtime so entry inlining is disabled | |
/******/ // startup | |
/******/ // Load entry module and return exports | |
/******/ return __webpack_require__("./index.js"); | |
/******/ })() | |
; | |
}); | |
//# sourceMappingURL=echarts-liquidfill.js.map |