From 2132150081d61b876c74e992c973ea1ba4bb2f61 Mon Sep 17 00:00:00 2001 From: zx <604444282@qq.com> Date: Thu, 9 Dec 2021 17:47:34 +0800 Subject: [PATCH] zx --- src/assets/images/carRound.png | Bin 0 -> 37498 bytes src/lycomponents/iHeaderBrand/index.vue | 13 +- src/lycomponents/iSwitchEvent/index.vue | 4 +- src/utils/gol/bubbleWord.js | 228 +-- src/utils/gol/bubbleWord/echarts-wordcloud.js | 1592 +++++++++++++++++ src/utils/gol/bubbleWord/index.js | 61 + src/utils/gol/wordCloudOld.js | 188 ++ .../EventDEC/mediaInterpretationEc/opt.js | 2 +- src/views/EventDEC/pnwcWord/opt.js | 2 +- .../brandSalesRankingTOP10Ranking/index.vue | 2 +- .../brandVolumeTOP10/index.vue | 2 +- .../keyActiveMediaTOP10Ranking/index.vue | 2 +- 12 files changed, 1916 insertions(+), 180 deletions(-) create mode 100644 src/assets/images/carRound.png create mode 100644 src/utils/gol/bubbleWord/echarts-wordcloud.js create mode 100644 src/utils/gol/bubbleWord/index.js create mode 100644 src/utils/gol/wordCloudOld.js diff --git a/src/assets/images/carRound.png b/src/assets/images/carRound.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd8114163000078fd35f3b056d09cf272e81cf5 GIT binary patch literal 37498 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 菜单 - + {{ item.value }} - + @@ -84,6 +84,8 @@ export default { sStartTime: "", sEndTime: "", }, + timeRange: [], + sTimeType: "", selDatas: [], //offsetDays: 86400000 * 30, //最多选择7天 timeShow: true @@ -107,6 +109,12 @@ export default { this.selTime = [this.form.sStartTime, this.form.sEndTime] } this.getSelect(); + if(this.getCtime2.sTimeType) { + this.form.sTimeType = this.getCtime2.sTimeType; + if(this.getCtime2.sTimeType == 4) { + this.timeRange = [this.getCtime2.sStartTime, this.getCtime2.sEndTime] + } + } }, mounted() { this.intDt = self.setInterval(() => { @@ -173,6 +181,7 @@ export default { obj.key === "eventInsight" ) { this.setHeaderType(3); + } else { this.setHeaderType(1); } diff --git a/src/lycomponents/iSwitchEvent/index.vue b/src/lycomponents/iSwitchEvent/index.vue index 739453a..4327bfc 100644 --- a/src/lycomponents/iSwitchEvent/index.vue +++ b/src/lycomponents/iSwitchEvent/index.vue @@ -75,7 +75,7 @@ export default { height: auto; background: #010b19; .ec-footer { - padding: 40px 0px; + padding: 10px 0px; img { width: 480px; height: 80px; @@ -84,7 +84,7 @@ export default { } .ec-d1 { width: 100%; - height: 190px; + height: 222px; border: 2px solid #0f2a4d; .ec-d1-inner { width: 100%; diff --git a/src/utils/gol/bubbleWord.js b/src/utils/gol/bubbleWord.js index 3343dd2..2abd678 100644 --- a/src/utils/gol/bubbleWord.js +++ b/src/utils/gol/bubbleWord.js @@ -1,188 +1,74 @@ -/* - * @Author: your name - * @Date: 2021-10-21 11:36:36 - * @LastEditTime: 2021-11-25 11:07:14 - * @LastEditors: Please set LastEditors - * @Description: In User Settings Edit - * @FilePath: /data-show/src/utils/gol/bubbleWord.js - */ -import { compare } from "./dataTool" -import * as echarts from "echarts"; +require("./bubbleWord/echarts-wordcloud"); + +let maskImage = new Image(); +maskImage.src = require('@/assets/images/carRound.png') +let colors = ['rgba(84,111,197,1)', 'rgba(145,203,116,1)', 'rgba(90,203,156,1)', 'rgba(248,200,87,1)', 'rgba(237,101,101,1)', "rgba(114,191,222,1)", 'rgba(58,162,114,1)', 'rgba(251,131,81,1)'] + // 将后台数据转成数组 function doWordCloud(data) { let arr1 = []; for (let key in data) { - let obj = { key: key, value: data[key] }; + let obj = { name: key, value: data[key] }; arr1.push(obj); } return arr1; } -// 气泡大小算法 -function bubbleDivide(val, maxVal, size) { - let percent = val / maxVal * 1.00; - if (0.15 { - temp.push(item[format[1]]); - }); - maxValue = Math.max.apply(null, temp); - // 气泡颜色数组 - let color = [ - { - key: '#047ddc', - fontColor: '#8ec0ea', - value: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { - offset: 0, - color: 'rgba(4, 60, 135, 1)' - }, - { - offset: 1, - color: 'rgba(1, 11, 25, 1)' - } - ], false) - }, - { - key: '#a3951f', - fontColor: '#a4a27f', - value: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { - offset: 0, - color: 'rgba(120, 124, 14, 1)' - }, - { - offset: 1, - color: 'rgba(1, 11, 25, 1)' - } - ], false) - }, - { - key: '#01aa87', - fontColor: '#99e5d5', - value: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ - { - offset: 0, - color: 'rgba(25, 137, 129, 1)' - }, - { - offset: 1, - color: 'rgba(1, 11, 25, 1)' - } - ], false) - } - - ]; - // 气泡颜色备份 - let bakeColor = [...color]; - // 气泡数据 - let bubbleData = []; - let basicSize = 20; //基础大小 - let repulsion = 90; //斥力因子 - // 填充气泡数据数组bubbleData - for (let item of data) { - // 确保气泡数据条数少于或等于气泡颜色数组大小时,气泡颜色不重复 - if (!bakeColor.length) bakeColor = [...color]; - let colorSet = new Set(bakeColor); - let curIndex = Math.round(Math.random() * (colorSet.size - 1)); - let borderColor = bakeColor[curIndex].key; - let curColor = bakeColor[curIndex].value; - let fontColor = bakeColor[curIndex].fontColor; - colorSet.delete(curColor); - bakeColor = [...colorSet]; - // 气泡大小设置 - //let size = (item[format[1]] * basicSize * 2) / maxValue; - let size = bubbleDivide(item[format[1]],maxValue,basicSize); - - bubbleData.push({ - name: item[format[0]], - value: item[format[1]], - symbolSize: size, - draggable: true, - label: { - show: true, - color: fontColor, - fontSize: 12 - }, - itemStyle: { - normal: { - color: curColor, - opacity: 0.8, - shadowBlur: 10, - shadowOffsetX: 0, - shadowOffsetY: 0, - shadowColor: "rgba(0,0,0,0.3)", - borderType : 'solid', - borderColor: borderColor, - borderWidth: 1 - }, - }, - }); - } - return { - bubbleData, - repulsion, - }; -} - -// 创建词云图 -export default function createWordCloud(obj) { - let bubble = null; - if (Array.isArray(obj)) { - bubble = bubbleChart(obj, ['key', 'value']); +//创建词云 +export default function createWordCloud(data) { + let showData = null; + if (Array.isArray(data)) { + let words = []; + data.forEach(e => { + let o = { + name: e.key, + value: e.value + } + words.push(o) + }) + showData = words; } else { - let words = doWordCloud(obj); - words.sort(compare('value')); - bubble = bubbleChart(words, ['key', 'value']); + let words = doWordCloud(data); + showData = words; } return { - animationEasingUpdate: 'bounceIn', - tooltip: { - backgroundColor: "#08182F", - color: "#fff", - borderColor: "#3373CC", + tooltip: {}, + series: [{ + type: 'wordCloud', + gridSize: 5, + sizeRange: [8, 60], + rotationRange: [0, 0], + //shape: 'circle', + maskImage: maskImage, + width: 600, + height: 390, + left: 'center', + top: 'center', + right: null, + bottom: null, + drawOutOfBound: true, textStyle: { - color: "#fff", //设置文字颜色 + fontFamily: 'sans-serif', + fontWeight: 'bold', + color: function () { + return colors[Math.floor((Math.random() * 8) + 0)]; + // return 'rgb(' + [ + // Math.round(Math.random() * 255), + // Math.round(Math.random() * 255), + // Math.round(Math.random() * 255) + // ].join(',') + ')'; + } }, - extraCssText: "box-shadow: 0px 0px 10px 0px #3373CC;", - formatter: function (param) { - let data = param.data; - return `${data.name}
${data.value}` - } - }, - series: [{ - type: 'graph', - layout: 'force', - force: { - gravity: 0.2, - repulsion: bubble.repulsion, - edgeLength: 10 + emphasis: { + textStyle: { + shadowBlur: 100, + shadowColor: '#333' + } }, - // 是否开启鼠标缩放和平移漫游 - roam: true, - data: bubble.bubbleData + data: showData + // { + // name: 'Sam S Club', + // value: 10000, + // } }] } } \ No newline at end of file diff --git a/src/utils/gol/bubbleWord/echarts-wordcloud.js b/src/utils/gol/bubbleWord/echarts-wordcloud.js new file mode 100644 index 0000000..7e0dd0a --- /dev/null +++ b/src/utils/gol/bubbleWord/echarts-wordcloud.js @@ -0,0 +1,1592 @@ +(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-wordcloud"] = factory(require("echarts")); + else + root["echarts-wordcloud"] = factory(root["echarts"]); +})(self, function(__WEBPACK_EXTERNAL_MODULE_echarts_lib_echarts__) { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./index.js": +/*!******************************!*\ + !*** ./index.js + 4 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/WordCloudSeries.js + + +external_echarts_.extendSeriesModel({ + + type: 'series.wordCloud', + + visualStyleAccessPath: 'textStyle', + visualStyleMapper: function (model) { + return { + fill: model.get('color') + }; + }, + visualDrawType: 'fill', + + 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; + }, + + // Most of options are from https://github.com/timdream/wordcloud2.js/blob/gh-pages/API.md + defaultOption: { + + maskImage: null, + + // Shape can be 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star' + shape: 'circle', + + left: 'center', + + top: 'center', + + width: '70%', + + height: '80%', + + sizeRange: [12, 60], + + rotationRange: [-90, 90], + + rotationStep: 45, + + gridSize: 8, + + drawOutOfBound: false, + + textStyle: { + fontWeight: 'normal' + } + } +}); + +;// CONCATENATED MODULE: ./src/WordCloudView.js + + +external_echarts_.extendChartView({ + + type: 'wordCloud', + + render: function (seriesModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + var data = seriesModel.getData(); + + var gridSize = seriesModel.get('gridSize'); + + seriesModel.layoutInstance.ondraw = function (text, size, dataIdx, drawn) { + var itemModel = data.getItemModel(dataIdx); + var textStyleModel = itemModel.getModel('textStyle'); + + var textEl = new external_echarts_.graphic.Text({ + style: external_echarts_.helper.createTextStyle(textStyleModel), + scaleX: 1 / drawn.info.mu, + scaleY: 1 / drawn.info.mu, + x: (drawn.gx + drawn.info.gw / 2) * gridSize, + y: (drawn.gy + drawn.info.gh / 2) * gridSize, + rotation: drawn.rot + }); + textEl.setStyle({ + x: drawn.info.fillTextOffsetX, + y: drawn.info.fillTextOffsetY + size * 0.5, + text: text, + verticalAlign: 'middle', + fill: data.getItemVisual(dataIdx, 'style').fill, + fontSize: size + }); + + group.add(textEl); + + data.setItemGraphicEl(dataIdx, textEl); + + textEl.ensureState('emphasis').style = external_echarts_.helper.createTextStyle(itemModel.getModel(['emphasis', 'textStyle']), { + state: 'emphasis' + }); + textEl.ensureState('blur').style = external_echarts_.helper.createTextStyle(itemModel.getModel(['blur', 'textStyle']), { + state: 'blur' + }); + + external_echarts_.helper.enableHoverEmphasis( + textEl, + itemModel.get(['emphasis', 'focus']), + itemModel.get(['emphasis', 'blurScope']) + ); + + textEl.stateTransition = { + duration: seriesModel.get('animation') ? seriesModel.get(['stateAnimation', 'duration']) : 0, + easing: seriesModel.get(['stateAnimation', 'easing']) + }; + // TODO + textEl.__highDownDispatcher = true; + }; + + this._model = seriesModel; + }, + + remove: function () { + this.group.removeAll(); + + this._model.layoutInstance.dispose(); + }, + + dispose: function () { + this._model.layoutInstance.dispose(); + } +}); + +;// CONCATENATED MODULE: ./src/layout.js +/*! + * wordcloud2.js + * http://timdream.org/wordcloud2.js/ + * + * Copyright 2011 - 2013 Tim Chien + * Released under the MIT license + */ + + + +// setImmediate +if (!window.setImmediate) { + window.setImmediate = (function setupSetImmediate() { + return window.msSetImmediate || + window.webkitSetImmediate || + window.mozSetImmediate || + window.oSetImmediate || + (function setupSetZeroTimeout() { + if (!window.postMessage || !window.addEventListener) { + return null; + } + + var callbacks = [undefined]; + var message = 'zero-timeout-message'; + + // Like setTimeout, but only takes a function argument. There's + // no time argument (always zero) and no arguments (you have to + // use a closure). + var setZeroTimeout = function setZeroTimeout(callback) { + var id = callbacks.length; + callbacks.push(callback); + window.postMessage(message + id.toString(36), '*'); + + return id; + }; + + window.addEventListener('message', function setZeroTimeoutMessage(evt) { + // Skipping checking event source, retarded IE confused this window + // object with another in the presence of iframe + if (typeof evt.data !== 'string' || + evt.data.substr(0, message.length) !== message/* || + evt.source !== window */) { + return; + } + + evt.stopImmediatePropagation(); + + var id = parseInt(evt.data.substr(message.length), 36); + if (!callbacks[id]) { + return; + } + + callbacks[id](); + callbacks[id] = undefined; + }, true); + + /* specify clearImmediate() here since we need the scope */ + window.clearImmediate = function clearZeroTimeout(id) { + if (!callbacks[id]) { + return; + } + + callbacks[id] = undefined; + }; + + return setZeroTimeout; + })() || + // fallback + function setImmediateFallback(fn) { + window.setTimeout(fn, 0); + }; + })(); +} + +if (!window.clearImmediate) { + window.clearImmediate = (function setupClearImmediate() { + return window.msClearImmediate || + window.webkitClearImmediate || + window.mozClearImmediate || + window.oClearImmediate || + // "clearZeroTimeout" is implement on the previous block || + // fallback + function clearImmediateFallback(timer) { + window.clearTimeout(timer); + }; + })(); +} + + // Check if WordCloud can run on this browser + var isSupported = (function isSupported() { + var canvas = document.createElement('canvas'); + if (!canvas || !canvas.getContext) { + return false; + } + + var ctx = canvas.getContext('2d'); + if (!ctx.getImageData) { + return false; + } + if (!ctx.fillText) { + return false; + } + + if (!Array.prototype.some) { + return false; + } + if (!Array.prototype.push) { + return false; + } + + return true; + }()); + + // Find out if the browser impose minium font size by + // drawing small texts on a canvas and measure it's width. + var minFontSize = (function getMinFontSize() { + if (!isSupported) { + return; + } + + var ctx = document.createElement('canvas').getContext('2d'); + + // start from 20 + var size = 20; + + // two sizes to measure + var hanWidth, mWidth; + + while (size) { + ctx.font = size.toString(10) + 'px sans-serif'; + if ((ctx.measureText('\uFF37').width === hanWidth) && + (ctx.measureText('m').width) === mWidth) { + return (size + 1); + } + + hanWidth = ctx.measureText('\uFF37').width; + mWidth = ctx.measureText('m').width; + + size--; + } + + return 0; + })(); + + // Based on http://jsfromhell.com/array/shuffle + var shuffleArray = function shuffleArray(arr) { + for (var j, x, i = arr.length; i; + j = Math.floor(Math.random() * i), + x = arr[--i], arr[i] = arr[j], + arr[j] = x) {} + return arr; + }; + + var WordCloud = function WordCloud(elements, options) { + if (!isSupported) { + return; + } + + if (!Array.isArray(elements)) { + elements = [elements]; + } + + elements.forEach(function(el, i) { + if (typeof el === 'string') { + elements[i] = document.getElementById(el); + if (!elements[i]) { + throw 'The element id specified is not found.'; + } + } else if (!el.tagName && !el.appendChild) { + throw 'You must pass valid HTML elements, or ID of the element.'; + } + }); + + /* Default values to be overwritten by options object */ + var settings = { + list: [], + fontFamily: '"Trebuchet MS", "Heiti TC", "微軟正黑體", ' + + '"Arial Unicode MS", "Droid Fallback Sans", sans-serif', + fontWeight: 'normal', + color: 'random-dark', + minSize: 0, // 0 to disable + weightFactor: 1, + clearCanvas: true, + backgroundColor: '#fff', // opaque white = rgba(255, 255, 255, 1) + + gridSize: 8, + drawOutOfBound: false, + origin: null, + + drawMask: false, + maskColor: 'rgba(255,0,0,0.3)', + maskGapWidth: 0.3, + + layoutAnimation: true, + + wait: 0, + abortThreshold: 0, // disabled + abort: function noop() {}, + + minRotation: - Math.PI / 2, + maxRotation: Math.PI / 2, + rotationStep: 0.1, + + shuffle: true, + rotateRatio: 0.1, + + shape: 'circle', + ellipticity: 0.65, + + classes: null, + + hover: null, + click: null + }; + + if (options) { + for (var key in options) { + if (key in settings) { + settings[key] = options[key]; + } + } + } + + /* Convert weightFactor into a function */ + if (typeof settings.weightFactor !== 'function') { + var factor = settings.weightFactor; + settings.weightFactor = function weightFactor(pt) { + return pt * factor; //in px + }; + } + + /* Convert shape into a function */ + if (typeof settings.shape !== 'function') { + switch (settings.shape) { + case 'circle': + /* falls through */ + default: + // 'circle' is the default and a shortcut in the code loop. + settings.shape = 'circle'; + break; + + case 'cardioid': + settings.shape = function shapeCardioid(theta) { + return 1 - Math.sin(theta); + }; + break; + + /* + To work out an X-gon, one has to calculate "m", + where 1/(cos(2*PI/X)+m*sin(2*PI/X)) = 1/(cos(0)+m*sin(0)) + http://www.wolframalpha.com/input/?i=1%2F%28cos%282*PI%2FX%29%2Bm*sin%28 + 2*PI%2FX%29%29+%3D+1%2F%28cos%280%29%2Bm*sin%280%29%29 + Copy the solution into polar equation r = 1/(cos(t') + m*sin(t')) + where t' equals to mod(t, 2PI/X); + */ + + case 'diamond': + case 'square': + // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+ + // %28t%2C+PI%2F2%29%29%2Bsin%28mod+%28t%2C+PI%2F2%29%29%29%2C+t+%3D + // +0+..+2*PI + settings.shape = function shapeSquare(theta) { + var thetaPrime = theta % (2 * Math.PI / 4); + return 1 / (Math.cos(thetaPrime) + Math.sin(thetaPrime)); + }; + break; + + case 'triangle-forward': + // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+ + // %28t%2C+2*PI%2F3%29%29%2Bsqrt%283%29sin%28mod+%28t%2C+2*PI%2F3%29 + // %29%29%2C+t+%3D+0+..+2*PI + settings.shape = function shapeTriangle(theta) { + var thetaPrime = theta % (2 * Math.PI / 3); + return 1 / (Math.cos(thetaPrime) + + Math.sqrt(3) * Math.sin(thetaPrime)); + }; + break; + + case 'triangle': + case 'triangle-upright': + settings.shape = function shapeTriangle(theta) { + var thetaPrime = (theta + Math.PI * 3 / 2) % (2 * Math.PI / 3); + return 1 / (Math.cos(thetaPrime) + + Math.sqrt(3) * Math.sin(thetaPrime)); + }; + break; + + case 'pentagon': + settings.shape = function shapePentagon(theta) { + var thetaPrime = (theta + 0.955) % (2 * Math.PI / 5); + return 1 / (Math.cos(thetaPrime) + + 0.726543 * Math.sin(thetaPrime)); + }; + break; + + case 'star': + settings.shape = function shapeStar(theta) { + var thetaPrime = (theta + 0.955) % (2 * Math.PI / 10); + if ((theta + 0.955) % (2 * Math.PI / 5) - (2 * Math.PI / 10) >= 0) { + return 1 / (Math.cos((2 * Math.PI / 10) - thetaPrime) + + 3.07768 * Math.sin((2 * Math.PI / 10) - thetaPrime)); + } else { + return 1 / (Math.cos(thetaPrime) + + 3.07768 * Math.sin(thetaPrime)); + } + }; + break; + } + } + + /* Make sure gridSize is a whole number and is not smaller than 4px */ + settings.gridSize = Math.max(Math.floor(settings.gridSize), 4); + + /* shorthand */ + var g = settings.gridSize; + var maskRectWidth = g - settings.maskGapWidth; + + /* normalize rotation settings */ + var rotationRange = Math.abs(settings.maxRotation - settings.minRotation); + var minRotation = Math.min(settings.maxRotation, settings.minRotation); + var rotationStep = settings.rotationStep; + + /* information/object available to all functions, set when start() */ + var grid, // 2d array containing filling information + ngx, ngy, // width and height of the grid + center, // position of the center of the cloud + maxRadius; + + /* timestamp for measuring each putWord() action */ + var escapeTime; + + /* function for getting the color of the text */ + var getTextColor; + function random_hsl_color(min, max) { + return 'hsl(' + + (Math.random() * 360).toFixed() + ',' + + (Math.random() * 30 + 70).toFixed() + '%,' + + (Math.random() * (max - min) + min).toFixed() + '%)'; + } + switch (settings.color) { + case 'random-dark': + getTextColor = function getRandomDarkColor() { + return random_hsl_color(10, 50); + }; + break; + + case 'random-light': + getTextColor = function getRandomLightColor() { + return random_hsl_color(50, 90); + }; + break; + + default: + if (typeof settings.color === 'function') { + getTextColor = settings.color; + } + break; + } + + /* function for getting the classes of the text */ + var getTextClasses = null; + if (typeof settings.classes === 'function') { + getTextClasses = settings.classes; + } + + /* Interactive */ + var interactive = false; + var infoGrid = []; + var hovered; + + var getInfoGridFromMouseTouchEvent = + function getInfoGridFromMouseTouchEvent(evt) { + var canvas = evt.currentTarget; + var rect = canvas.getBoundingClientRect(); + var clientX; + var clientY; + /** Detect if touches are available */ + if (evt.touches) { + clientX = evt.touches[0].clientX; + clientY = evt.touches[0].clientY; + } else { + clientX = evt.clientX; + clientY = evt.clientY; + } + var eventX = clientX - rect.left; + var eventY = clientY - rect.top; + + var x = Math.floor(eventX * ((canvas.width / rect.width) || 1) / g); + var y = Math.floor(eventY * ((canvas.height / rect.height) || 1) / g); + + return infoGrid[x][y]; + }; + + var wordcloudhover = function wordcloudhover(evt) { + var info = getInfoGridFromMouseTouchEvent(evt); + + if (hovered === info) { + return; + } + + hovered = info; + if (!info) { + settings.hover(undefined, undefined, evt); + + return; + } + + settings.hover(info.item, info.dimension, evt); + + }; + + var wordcloudclick = function wordcloudclick(evt) { + var info = getInfoGridFromMouseTouchEvent(evt); + if (!info) { + return; + } + + settings.click(info.item, info.dimension, evt); + evt.preventDefault(); + }; + + /* Get points on the grid for a given radius away from the center */ + var pointsAtRadius = []; + var getPointsAtRadius = function getPointsAtRadius(radius) { + if (pointsAtRadius[radius]) { + return pointsAtRadius[radius]; + } + + // Look for these number of points on each radius + var T = radius * 8; + + // Getting all the points at this radius + var t = T; + var points = []; + + if (radius === 0) { + points.push([center[0], center[1], 0]); + } + + while (t--) { + // distort the radius to put the cloud in shape + var rx = 1; + if (settings.shape !== 'circle') { + rx = settings.shape(t / T * 2 * Math.PI); // 0 to 1 + } + + // Push [x, y, t]; t is used solely for getTextColor() + points.push([ + center[0] + radius * rx * Math.cos(-t / T * 2 * Math.PI), + center[1] + radius * rx * Math.sin(-t / T * 2 * Math.PI) * + settings.ellipticity, + t / T * 2 * Math.PI]); + } + + pointsAtRadius[radius] = points; + return points; + }; + + /* Return true if we had spent too much time */ + var exceedTime = function exceedTime() { + return ((settings.abortThreshold > 0) && + ((new Date()).getTime() - escapeTime > settings.abortThreshold)); + }; + + /* Get the deg of rotation according to settings, and luck. */ + var getRotateDeg = function getRotateDeg() { + if (settings.rotateRatio === 0) { + return 0; + } + + if (Math.random() > settings.rotateRatio) { + return 0; + } + + if (rotationRange === 0) { + return minRotation; + } + + return minRotation + Math.round(Math.random() * rotationRange / rotationStep) * rotationStep; + }; + + var getTextInfo = function getTextInfo(word, weight, rotateDeg) { + // calculate the acutal font size + // fontSize === 0 means weightFactor function wants the text skipped, + // and size < minSize means we cannot draw the text. + var debug = false; + var fontSize = settings.weightFactor(weight); + if (fontSize <= settings.minSize) { + return false; + } + + // Scale factor here is to make sure fillText is not limited by + // the minium font size set by browser. + // It will always be 1 or 2n. + var mu = 1; + if (fontSize < minFontSize) { + mu = (function calculateScaleFactor() { + var mu = 2; + while (mu * fontSize < minFontSize) { + mu += 2; + } + return mu; + })(); + } + + var fcanvas = document.createElement('canvas'); + var fctx = fcanvas.getContext('2d', { willReadFrequently: true }); + + fctx.font = settings.fontWeight + ' ' + + (fontSize * mu).toString(10) + 'px ' + settings.fontFamily; + + // Estimate the dimension of the text with measureText(). + var fw = fctx.measureText(word).width / mu; + var fh = Math.max(fontSize * mu, + fctx.measureText('m').width, + fctx.measureText('\uFF37').width) / mu; + + // Create a boundary box that is larger than our estimates, + // so text don't get cut of (it sill might) + var boxWidth = fw + fh * 2; + var boxHeight = fh * 3; + var fgw = Math.ceil(boxWidth / g); + var fgh = Math.ceil(boxHeight / g); + boxWidth = fgw * g; + boxHeight = fgh * g; + + // Calculate the proper offsets to make the text centered at + // the preferred position. + + // This is simply half of the width. + var fillTextOffsetX = - fw / 2; + // Instead of moving the box to the exact middle of the preferred + // position, for Y-offset we move 0.4 instead, so Latin alphabets look + // vertical centered. + var fillTextOffsetY = - fh * 0.4; + + // Calculate the actual dimension of the canvas, considering the rotation. + var cgh = Math.ceil((boxWidth * Math.abs(Math.sin(rotateDeg)) + + boxHeight * Math.abs(Math.cos(rotateDeg))) / g); + var cgw = Math.ceil((boxWidth * Math.abs(Math.cos(rotateDeg)) + + boxHeight * Math.abs(Math.sin(rotateDeg))) / g); + var width = cgw * g; + var height = cgh * g; + + fcanvas.setAttribute('width', width); + fcanvas.setAttribute('height', height); + + if (debug) { + // Attach fcanvas to the DOM + document.body.appendChild(fcanvas); + // Save it's state so that we could restore and draw the grid correctly. + fctx.save(); + } + + // Scale the canvas with |mu|. + fctx.scale(1 / mu, 1 / mu); + fctx.translate(width * mu / 2, height * mu / 2); + fctx.rotate(- rotateDeg); + + // Once the width/height is set, ctx info will be reset. + // Set it again here. + fctx.font = settings.fontWeight + ' ' + + (fontSize * mu).toString(10) + 'px ' + settings.fontFamily; + + // Fill the text into the fcanvas. + // XXX: We cannot because textBaseline = 'top' here because + // Firefox and Chrome uses different default line-height for canvas. + // Please read https://bugzil.la/737852#c6. + // Here, we use textBaseline = 'middle' and draw the text at exactly + // 0.5 * fontSize lower. + fctx.fillStyle = '#000'; + fctx.textBaseline = 'middle'; + fctx.fillText(word, fillTextOffsetX * mu, + (fillTextOffsetY + fontSize * 0.5) * mu); + + // Get the pixels of the text + var imageData = fctx.getImageData(0, 0, width, height).data; + + if (exceedTime()) { + return false; + } + + if (debug) { + // Draw the box of the original estimation + fctx.strokeRect(fillTextOffsetX * mu, + fillTextOffsetY, fw * mu, fh * mu); + fctx.restore(); + } + + // Read the pixels and save the information to the occupied array + var occupied = []; + var gx = cgw, gy, x, y; + var bounds = [cgh / 2, cgw / 2, cgh / 2, cgw / 2]; + while (gx--) { + gy = cgh; + while (gy--) { + y = g; + singleGridLoop: { + while (y--) { + x = g; + while (x--) { + if (imageData[((gy * g + y) * width + + (gx * g + x)) * 4 + 3]) { + occupied.push([gx, gy]); + + if (gx < bounds[3]) { + bounds[3] = gx; + } + if (gx > bounds[1]) { + bounds[1] = gx; + } + if (gy < bounds[0]) { + bounds[0] = gy; + } + if (gy > bounds[2]) { + bounds[2] = gy; + } + + if (debug) { + fctx.fillStyle = 'rgba(255, 0, 0, 0.5)'; + fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5); + } + break singleGridLoop; + } + } + } + if (debug) { + fctx.fillStyle = 'rgba(0, 0, 255, 0.5)'; + fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5); + } + } + } + } + + if (debug) { + fctx.fillStyle = 'rgba(0, 255, 0, 0.5)'; + fctx.fillRect(bounds[3] * g, + bounds[0] * g, + (bounds[1] - bounds[3] + 1) * g, + (bounds[2] - bounds[0] + 1) * g); + } + + // Return information needed to create the text on the real canvas + return { + mu: mu, + occupied: occupied, + bounds: bounds, + gw: cgw, + gh: cgh, + fillTextOffsetX: fillTextOffsetX, + fillTextOffsetY: fillTextOffsetY, + fillTextWidth: fw, + fillTextHeight: fh, + fontSize: fontSize + }; + }; + + /* Determine if there is room available in the given dimension */ + var canFitText = function canFitText(gx, gy, gw, gh, occupied) { + // Go through the occupied points, + // return false if the space is not available. + var i = occupied.length; + while (i--) { + var px = gx + occupied[i][0]; + var py = gy + occupied[i][1]; + + if (px >= ngx || py >= ngy || px < 0 || py < 0) { + if (!settings.drawOutOfBound) { + return false; + } + continue; + } + + if (!grid[px][py]) { + return false; + } + } + return true; + }; + + /* Actually draw the text on the grid */ + var drawText = function drawText(gx, gy, info, word, weight, + distance, theta, rotateDeg, attributes) { + + var fontSize = info.fontSize; + var color; + if (getTextColor) { + color = getTextColor(word, weight, fontSize, distance, theta); + } else { + color = settings.color; + } + + var classes; + if (getTextClasses) { + classes = getTextClasses(word, weight, fontSize, distance, theta); + } else { + classes = settings.classes; + } + + var dimension; + var bounds = info.bounds; + dimension = { + x: (gx + bounds[3]) * g, + y: (gy + bounds[0]) * g, + w: (bounds[1] - bounds[3] + 1) * g, + h: (bounds[2] - bounds[0] + 1) * g + }; + + elements.forEach(function(el) { + if (el.getContext) { + var ctx = el.getContext('2d'); + var mu = info.mu; + + // Save the current state before messing it + ctx.save(); + ctx.scale(1 / mu, 1 / mu); + + ctx.font = settings.fontWeight + ' ' + + (fontSize * mu).toString(10) + 'px ' + settings.fontFamily; + ctx.fillStyle = color; + + // Translate the canvas position to the origin coordinate of where + // the text should be put. + ctx.translate((gx + info.gw / 2) * g * mu, + (gy + info.gh / 2) * g * mu); + + if (rotateDeg !== 0) { + ctx.rotate(- rotateDeg); + } + + // Finally, fill the text. + + // XXX: We cannot because textBaseline = 'top' here because + // Firefox and Chrome uses different default line-height for canvas. + // Please read https://bugzil.la/737852#c6. + // Here, we use textBaseline = 'middle' and draw the text at exactly + // 0.5 * fontSize lower. + ctx.textBaseline = 'middle'; + ctx.fillText(word, info.fillTextOffsetX * mu, + (info.fillTextOffsetY + fontSize * 0.5) * mu); + + // The below box is always matches how s are positioned + /* ctx.strokeRect(info.fillTextOffsetX, info.fillTextOffsetY, + info.fillTextWidth, info.fillTextHeight); */ + + // Restore the state. + ctx.restore(); + } else { + // drawText on DIV element + var span = document.createElement('span'); + var transformRule = ''; + transformRule = 'rotate(' + (- rotateDeg / Math.PI * 180) + 'deg) '; + if (info.mu !== 1) { + transformRule += + 'translateX(-' + (info.fillTextWidth / 4) + 'px) ' + + 'scale(' + (1 / info.mu) + ')'; + } + var styleRules = { + 'position': 'absolute', + 'display': 'block', + 'font': settings.fontWeight + ' ' + + (fontSize * info.mu) + 'px ' + settings.fontFamily, + 'left': ((gx + info.gw / 2) * g + info.fillTextOffsetX) + 'px', + 'top': ((gy + info.gh / 2) * g + info.fillTextOffsetY) + 'px', + 'width': info.fillTextWidth + 'px', + 'height': info.fillTextHeight + 'px', + 'lineHeight': fontSize + 'px', + 'whiteSpace': 'nowrap', + 'transform': transformRule, + 'webkitTransform': transformRule, + 'msTransform': transformRule, + 'transformOrigin': '50% 40%', + 'webkitTransformOrigin': '50% 40%', + 'msTransformOrigin': '50% 40%' + }; + if (color) { + styleRules.color = color; + } + span.textContent = word; + for (var cssProp in styleRules) { + span.style[cssProp] = styleRules[cssProp]; + } + if (attributes) { + for (var attribute in attributes) { + span.setAttribute(attribute, attributes[attribute]); + } + } + if (classes) { + span.className += classes; + } + el.appendChild(span); + } + }); + }; + + /* Help function to updateGrid */ + var fillGridAt = function fillGridAt(x, y, drawMask, dimension, item) { + if (x >= ngx || y >= ngy || x < 0 || y < 0) { + return; + } + + grid[x][y] = false; + + if (drawMask) { + var ctx = elements[0].getContext('2d'); + ctx.fillRect(x * g, y * g, maskRectWidth, maskRectWidth); + } + + if (interactive) { + infoGrid[x][y] = { item: item, dimension: dimension }; + } + }; + + /* Update the filling information of the given space with occupied points. + Draw the mask on the canvas if necessary. */ + var updateGrid = function updateGrid(gx, gy, gw, gh, info, item) { + var occupied = info.occupied; + var drawMask = settings.drawMask; + var ctx; + if (drawMask) { + ctx = elements[0].getContext('2d'); + ctx.save(); + ctx.fillStyle = settings.maskColor; + } + + var dimension; + if (interactive) { + var bounds = info.bounds; + dimension = { + x: (gx + bounds[3]) * g, + y: (gy + bounds[0]) * g, + w: (bounds[1] - bounds[3] + 1) * g, + h: (bounds[2] - bounds[0] + 1) * g + }; + } + + var i = occupied.length; + while (i--) { + var px = gx + occupied[i][0]; + var py = gy + occupied[i][1]; + + if (px >= ngx || py >= ngy || px < 0 || py < 0) { + continue; + } + + fillGridAt(px, py, drawMask, dimension, item); + } + + if (drawMask) { + ctx.restore(); + } + }; + + /* putWord() processes each item on the list, + calculate it's size and determine it's position, and actually + put it on the canvas. */ + var putWord = function putWord(item) { + var word, weight, attributes; + if (Array.isArray(item)) { + word = item[0]; + weight = item[1]; + } else { + word = item.word; + weight = item.weight; + attributes = item.attributes; + } + var rotateDeg = getRotateDeg(); + + // get info needed to put the text onto the canvas + var info = getTextInfo(word, weight, rotateDeg); + + // not getting the info means we shouldn't be drawing this one. + if (!info) { + return false; + } + + if (exceedTime()) { + return false; + } + + // If drawOutOfBound is set to false, + // skip the loop if we have already know the bounding box of + // word is larger than the canvas. + if (!settings.drawOutOfBound) { + var bounds = info.bounds; + if ((bounds[1] - bounds[3] + 1) > ngx || + (bounds[2] - bounds[0] + 1) > ngy) { + return false; + } + } + + // Determine the position to put the text by + // start looking for the nearest points + var r = maxRadius + 1; + + var tryToPutWordAtPoint = function(gxy) { + var gx = Math.floor(gxy[0] - info.gw / 2); + var gy = Math.floor(gxy[1] - info.gh / 2); + var gw = info.gw; + var gh = info.gh; + + // If we cannot fit the text at this position, return false + // and go to the next position. + if (!canFitText(gx, gy, gw, gh, info.occupied)) { + return false; + } + + // Actually put the text on the canvas + drawText(gx, gy, info, word, weight, + (maxRadius - r), gxy[2], rotateDeg, attributes); + + // Mark the spaces on the grid as filled + updateGrid(gx, gy, gw, gh, info, item); + + return { + gx: gx, + gy: gy, + rot: rotateDeg, + info: info + }; + }; + + while (r--) { + var points = getPointsAtRadius(maxRadius - r); + + if (settings.shuffle) { + points = [].concat(points); + shuffleArray(points); + } + + // Try to fit the words by looking at each point. + // array.some() will stop and return true + // when putWordAtPoint() returns true. + for (var i = 0; i < points.length; i++) { + var res = tryToPutWordAtPoint(points[i]); + if (res) { + return res; + } + } + + // var drawn = points.some(tryToPutWordAtPoint); + // if (drawn) { + // // leave putWord() and return true + // return true; + // } + } + // we tried all distances but text won't fit, return null + return null; + }; + + /* Send DOM event to all elements. Will stop sending event and return + if the previous one is canceled (for cancelable events). */ + var sendEvent = function sendEvent(type, cancelable, detail) { + if (cancelable) { + return !elements.some(function(el) { + var evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(type, true, cancelable, detail || {}); + return !el.dispatchEvent(evt); + }, this); + } else { + elements.forEach(function(el) { + var evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(type, true, cancelable, detail || {}); + el.dispatchEvent(evt); + }, this); + } + }; + + /* Start drawing on a canvas */ + var start = function start() { + // For dimensions, clearCanvas etc., + // we only care about the first element. + var canvas = elements[0]; + + if (canvas.getContext) { + ngx = Math.ceil(canvas.width / g); + ngy = Math.ceil(canvas.height / g); + } else { + var rect = canvas.getBoundingClientRect(); + ngx = Math.ceil(rect.width / g); + ngy = Math.ceil(rect.height / g); + } + + // Sending a wordcloudstart event which cause the previous loop to stop. + // Do nothing if the event is canceled. + if (!sendEvent('wordcloudstart', true)) { + return; + } + + // Determine the center of the word cloud + center = (settings.origin) ? + [settings.origin[0]/g, settings.origin[1]/g] : + [ngx / 2, ngy / 2]; + + // Maxium radius to look for space + maxRadius = Math.floor(Math.sqrt(ngx * ngx + ngy * ngy)); + + /* Clear the canvas only if the clearCanvas is set, + if not, update the grid to the current canvas state */ + grid = []; + + var gx, gy, i; + if (!canvas.getContext || settings.clearCanvas) { + elements.forEach(function(el) { + if (el.getContext) { + var ctx = el.getContext('2d'); + ctx.fillStyle = settings.backgroundColor; + ctx.clearRect(0, 0, ngx * (g + 1), ngy * (g + 1)); + ctx.fillRect(0, 0, ngx * (g + 1), ngy * (g + 1)); + } else { + el.textContent = ''; + el.style.backgroundColor = settings.backgroundColor; + el.style.position = 'relative'; + } + }); + + /* fill the grid with empty state */ + gx = ngx; + while (gx--) { + grid[gx] = []; + gy = ngy; + while (gy--) { + grid[gx][gy] = true; + } + } + } else { + /* Determine bgPixel by creating + another canvas and fill the specified background color. */ + var bctx = document.createElement('canvas').getContext('2d'); + + bctx.fillStyle = settings.backgroundColor; + bctx.fillRect(0, 0, 1, 1); + var bgPixel = bctx.getImageData(0, 0, 1, 1).data; + + /* Read back the pixels of the canvas we got to tell which part of the + canvas is empty. + (no clearCanvas only works with a canvas, not divs) */ + var imageData = + canvas.getContext('2d').getImageData(0, 0, ngx * g, ngy * g).data; + + gx = ngx; + var x, y; + while (gx--) { + grid[gx] = []; + gy = ngy; + while (gy--) { + y = g; + singleGridLoop: while (y--) { + x = g; + while (x--) { + i = 4; + while (i--) { + if (imageData[((gy * g + y) * ngx * g + + (gx * g + x)) * 4 + i] !== bgPixel[i]) { + grid[gx][gy] = false; + break singleGridLoop; + } + } + } + } + if (grid[gx][gy] !== false) { + grid[gx][gy] = true; + } + } + } + + imageData = bctx = bgPixel = undefined; + } + + // fill the infoGrid with empty state if we need it + if (settings.hover || settings.click) { + + interactive = true; + + /* fill the grid with empty state */ + gx = ngx + 1; + while (gx--) { + infoGrid[gx] = []; + } + + if (settings.hover) { + canvas.addEventListener('mousemove', wordcloudhover); + } + + if (settings.click) { + canvas.addEventListener('click', wordcloudclick); + canvas.addEventListener('touchstart', wordcloudclick); + canvas.addEventListener('touchend', function (e) { + e.preventDefault(); + }); + canvas.style.webkitTapHighlightColor = 'rgba(0, 0, 0, 0)'; + } + + canvas.addEventListener('wordcloudstart', function stopInteraction() { + canvas.removeEventListener('wordcloudstart', stopInteraction); + + canvas.removeEventListener('mousemove', wordcloudhover); + canvas.removeEventListener('click', wordcloudclick); + hovered = undefined; + }); + } + + i = 0; + var loopingFunction, stoppingFunction; + var layouting = true; + if (!settings.layoutAnimation) { + loopingFunction = function (cb) { + cb(); + } + stoppingFunction = function () { + layouting = false; + } + } + else if (settings.wait !== 0) { + loopingFunction = window.setTimeout; + stoppingFunction = window.clearTimeout; + } else { + loopingFunction = window.setImmediate; + stoppingFunction = window.clearImmediate; + } + + var addEventListener = function addEventListener(type, listener) { + elements.forEach(function(el) { + el.addEventListener(type, listener); + }, this); + }; + + var removeEventListener = function removeEventListener(type, listener) { + elements.forEach(function(el) { + el.removeEventListener(type, listener); + }, this); + }; + + var anotherWordCloudStart = function anotherWordCloudStart() { + removeEventListener('wordcloudstart', anotherWordCloudStart); + stoppingFunction(timer); + }; + + addEventListener('wordcloudstart', anotherWordCloudStart); + + // At least wait the following code before call the first iteration. + var timer = (settings.layoutAnimation ? loopingFunction : setTimeout)(function loop() { + if (!layouting) { + return; + } + if (i >= settings.list.length) { + stoppingFunction(timer); + sendEvent('wordcloudstop', false); + removeEventListener('wordcloudstart', anotherWordCloudStart); + + return; + } + escapeTime = (new Date()).getTime(); + var drawn = putWord(settings.list[i]); + var canceled = !sendEvent('wordclouddrawn', true, { + item: settings.list[i], drawn: drawn }); + if (exceedTime() || canceled) { + stoppingFunction(timer); + settings.abort(); + sendEvent('wordcloudabort', false); + sendEvent('wordcloudstop', false); + removeEventListener('wordcloudstart', anotherWordCloudStart); + return; + } + i++; + timer = loopingFunction(loop, settings.wait); + }, settings.wait); + }; + + // All set, start the drawing + start(); + }; + + WordCloud.isSupported = isSupported; + WordCloud.minFontSize = minFontSize; + + /* harmony default export */ const layout = (WordCloud); +;// CONCATENATED MODULE: ./src/wordCloud.js + + + + + + + +if (!layout.isSupported) { + throw new Error('Sorry your browser not support wordCloud'); +} + +// https://github.com/timdream/wordcloud2.js/blob/c236bee60436e048949f9becc4f0f67bd832dc5c/index.js#L233 +function updateCanvasMask(maskCanvas) { + var ctx = maskCanvas.getContext('2d'); + var imageData = ctx.getImageData( + 0, 0, maskCanvas.width, maskCanvas.height); + var newImageData = ctx.createImageData(imageData); + + var toneSum = 0; + var toneCnt = 0; + for (var i = 0; i < imageData.data.length; i += 4) { + var alpha = imageData.data[i + 3]; + if (alpha > 128) { + var tone = imageData.data[i] + + imageData.data[i + 1] + + imageData.data[i + 2]; + toneSum += tone; + ++toneCnt; + } + } + var threshold = toneSum / toneCnt; + + for (var i = 0; i < imageData.data.length; i += 4) { + var tone = imageData.data[i] + + imageData.data[i + 1] + + imageData.data[i + 2]; + var alpha = imageData.data[i + 3]; + + if (alpha < 128 || tone > threshold) { + // Area not to draw + newImageData.data[i] = 0; + newImageData.data[i + 1] = 0; + newImageData.data[i + 2] = 0; + newImageData.data[i + 3] = 0; + } + else { + // Area to draw + // The color must be same with backgroundColor + newImageData.data[i] = 255; + newImageData.data[i + 1] = 255; + newImageData.data[i + 2] = 255; + newImageData.data[i + 3] = 255; + } + } + + ctx.putImageData(newImageData, 0, 0); +} + +external_echarts_.registerLayout(function (ecModel, api) { + ecModel.eachSeriesByType('wordCloud', function (seriesModel) { + var gridRect = external_echarts_.helper.getLayoutRect( + seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + } + ); + var data = seriesModel.getData(); + + var canvas = document.createElement('canvas'); + canvas.width = gridRect.width; + canvas.height = gridRect.height; + + var ctx = canvas.getContext('2d'); + var maskImage = seriesModel.get('maskImage'); + if (maskImage) { + try { + ctx.drawImage(maskImage, 0, 0, canvas.width, canvas.height); + updateCanvasMask(canvas); + } + catch (e) { + console.error('Invalid mask image'); + console.error(e.toString()); + } + } + + var sizeRange = seriesModel.get('sizeRange'); + var rotationRange = seriesModel.get('rotationRange'); + var valueExtent = data.getDataExtent('value'); + + var DEGREE_TO_RAD = Math.PI / 180; + var gridSize = seriesModel.get('gridSize'); + layout(canvas, { + list: data.mapArray('value', function (value, idx) { + var itemModel = data.getItemModel(idx); + return [ + data.getName(idx), + itemModel.get('textStyle.fontSize', true) + || external_echarts_.number.linearMap(value, valueExtent, sizeRange), + idx + ]; + }).sort(function (a, b) { + // Sort from large to small in case there is no more room for more words + return b[1] - a[1]; + }), + fontFamily: seriesModel.get('textStyle.fontFamily') + || seriesModel.get('emphasis.textStyle.fontFamily') + || ecModel.get('textStyle.fontFamily'), + fontWeight: seriesModel.get('textStyle.fontWeight') + || seriesModel.get('emphasis.textStyle.fontWeight') + || ecModel.get('textStyle.fontWeight'), + + gridSize: gridSize, + + ellipticity: gridRect.height / gridRect.width, + + minRotation: rotationRange[0] * DEGREE_TO_RAD, + maxRotation: rotationRange[1] * DEGREE_TO_RAD, + + clearCanvas: !maskImage, + + rotateRatio: 1, + + rotationStep: seriesModel.get('rotationStep') * DEGREE_TO_RAD, + + drawOutOfBound: seriesModel.get('drawOutOfBound'), + + layoutAnimation: seriesModel.get('layoutAnimation'), + + shuffle: false, + + shape: seriesModel.get('shape') + }); + + function onWordCloudDrawn(e) { + var item = e.detail.item; + if (e.detail.drawn && seriesModel.layoutInstance.ondraw) { + e.detail.drawn.gx += gridRect.x / gridSize; + e.detail.drawn.gy += gridRect.y / gridSize; + seriesModel.layoutInstance.ondraw( + item[0], item[1], item[2], e.detail.drawn + ); + } + } + + canvas.addEventListener('wordclouddrawn', onWordCloudDrawn); + + if (seriesModel.layoutInstance) { + // Dispose previous + seriesModel.layoutInstance.dispose(); + } + + seriesModel.layoutInstance = { + ondraw: null, + + dispose: function () { + canvas.removeEventListener('wordclouddrawn', onWordCloudDrawn); + // Abort + canvas.addEventListener('wordclouddrawn', function (e) { + // Prevent default to cancle the event and stop the loop + e.preventDefault(); + }); + } + }; + }); +}); + +external_echarts_.registerPreprocessor(function (option) { + var series = (option || {}).series; + !external_echarts_.util.isArray(series) && (series = series ? [series] : []); + + var compats = ['shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + + external_echarts_.util.each(series, function (seriesItem) { + if (seriesItem && seriesItem.type === 'wordCloud') { + var textStyle = seriesItem.textStyle || {}; + + compatTextStyle(textStyle.normal); + compatTextStyle(textStyle.emphasis); + } + }); + + function compatTextStyle(textStyle) { + textStyle && external_echarts_.util.each(compats, function (key) { + if (textStyle.hasOwnProperty(key)) { + textStyle['text' + external_echarts_.format.capitalFirst(key)] = textStyle[key]; + } + }); + } +}); + +;// 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-wordcloud.js.map \ No newline at end of file diff --git a/src/utils/gol/bubbleWord/index.js b/src/utils/gol/bubbleWord/index.js new file mode 100644 index 0000000..fbc4db0 --- /dev/null +++ b/src/utils/gol/bubbleWord/index.js @@ -0,0 +1,61 @@ + +require("./echarts-wordcloud"); + +// 将后台数据转成数组 +function doWordCloud(data) { + let arr1 = []; + for (let key in data) { + let obj = { name: key, value: data[key] }; + arr1.push(obj); + } + return arr1; +} +//创建词云 +export default function createWordCloud(data) { + let showData = null; + if (Array.isArray(data)) { + showData = data; + } else { + let words = doWordCloud(data); + showData = words; + } + return { + tooltip: {}, + series: [{ + type: 'wordCloud', + gridSize: 12, + sizeRange: [10, 52], + rotationRange: [0, 0], + shape: 'circle', + width: 400, + height: 400, + left: 'center', + top: 'center', + right: null, + bottom: null, + drawOutOfBound: true, + textStyle: { + fontFamily: 'sans-serif', + fontWeight: 'bold', + color: function () { + return 'rgb(' + [ + Math.round(Math.random() * 255), + Math.round(Math.random() * 255), + Math.round(Math.random() * 255) + ].join(',') + ')'; + } + }, + emphasis: { + textStyle: { + shadowBlur: 100, + shadowColor: '#333' + } + }, + data: showData + // { + // name: 'Sam S Club', + // value: 10000, + // } + }] + } +} \ No newline at end of file diff --git a/src/utils/gol/wordCloudOld.js b/src/utils/gol/wordCloudOld.js new file mode 100644 index 0000000..97508db --- /dev/null +++ b/src/utils/gol/wordCloudOld.js @@ -0,0 +1,188 @@ +/* + * @Author: your name + * @Date: 2021-10-21 11:36:36 + * @LastEditTime: 2021-11-25 11:07:14 + * @LastEditors: Please set LastEditors + * @Description: In User Settings Edit + * + */ +import { compare } from "./dataTool" +import * as echarts from "echarts"; +// 将后台数据转成数组 +function doWordCloud(data) { + let arr1 = []; + for (let key in data) { + let obj = { key: key, value: data[key] }; + arr1.push(obj); + } + return arr1; +} +// 气泡大小算法 +function bubbleDivide(val, maxVal, size) { + let percent = val / maxVal * 1.00; + if (0.15 { + temp.push(item[format[1]]); + }); + maxValue = Math.max.apply(null, temp); + // 气泡颜色数组 + let color = [ + { + key: '#047ddc', + fontColor: '#8ec0ea', + value: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(4, 60, 135, 1)' + }, + { + offset: 1, + color: 'rgba(1, 11, 25, 1)' + } + ], false) + }, + { + key: '#a3951f', + fontColor: '#a4a27f', + value: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(120, 124, 14, 1)' + }, + { + offset: 1, + color: 'rgba(1, 11, 25, 1)' + } + ], false) + }, + { + key: '#01aa87', + fontColor: '#99e5d5', + value: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(25, 137, 129, 1)' + }, + { + offset: 1, + color: 'rgba(1, 11, 25, 1)' + } + ], false) + } + + ]; + // 气泡颜色备份 + let bakeColor = [...color]; + // 气泡数据 + let bubbleData = []; + let basicSize = 20; //基础大小 + let repulsion = 90; //斥力因子 + // 填充气泡数据数组bubbleData + for (let item of data) { + // 确保气泡数据条数少于或等于气泡颜色数组大小时,气泡颜色不重复 + if (!bakeColor.length) bakeColor = [...color]; + let colorSet = new Set(bakeColor); + let curIndex = Math.round(Math.random() * (colorSet.size - 1)); + let borderColor = bakeColor[curIndex].key; + let curColor = bakeColor[curIndex].value; + let fontColor = bakeColor[curIndex].fontColor; + colorSet.delete(curColor); + bakeColor = [...colorSet]; + // 气泡大小设置 + //let size = (item[format[1]] * basicSize * 2) / maxValue; + let size = bubbleDivide(item[format[1]],maxValue,basicSize); + + bubbleData.push({ + name: item[format[0]], + value: item[format[1]], + symbolSize: size, + draggable: true, + label: { + show: true, + color: fontColor, + fontSize: 12 + }, + itemStyle: { + normal: { + color: curColor, + opacity: 0.8, + shadowBlur: 10, + shadowOffsetX: 0, + shadowOffsetY: 0, + shadowColor: "rgba(0,0,0,0.3)", + borderType : 'solid', + borderColor: borderColor, + borderWidth: 1 + }, + }, + }); + } + return { + bubbleData, + repulsion, + }; +} + +// 创建词云图 +export default function createWordCloud(obj) { + let bubble = null; + if (Array.isArray(obj)) { + bubble = bubbleChart(obj, ['key', 'value']); + } else { + let words = doWordCloud(obj); + words.sort(compare('value')); + bubble = bubbleChart(words, ['key', 'value']); + } + return { + animationEasingUpdate: 'bounceIn', + tooltip: { + backgroundColor: "#08182F", + color: "#fff", + borderColor: "#3373CC", + textStyle: { + color: "#fff", //设置文字颜色 + }, + extraCssText: "box-shadow: 0px 0px 10px 0px #3373CC;", + formatter: function (param) { + let data = param.data; + return `${data.name}
${data.value}` + } + }, + series: [{ + type: 'graph', + layout: 'force', + force: { + gravity: 0.2, + repulsion: bubble.repulsion, + edgeLength: 10 + }, + // 是否开启鼠标缩放和平移漫游 + roam: true, + data: bubble.bubbleData + }] + } +} diff --git a/src/views/EventDEC/mediaInterpretationEc/opt.js b/src/views/EventDEC/mediaInterpretationEc/opt.js index b9a927f..e2e2726 100644 --- a/src/views/EventDEC/mediaInterpretationEc/opt.js +++ b/src/views/EventDEC/mediaInterpretationEc/opt.js @@ -4,7 +4,7 @@ * @LastEditTime: 2021-10-29 21:30:46 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit - * @FilePath: /data-show/src/utils/gol/bubbleWord.js + * */ import {compare} from "./dataTool" // 将后台数据转成数组 diff --git a/src/views/EventDEC/pnwcWord/opt.js b/src/views/EventDEC/pnwcWord/opt.js index b9a927f..e2e2726 100644 --- a/src/views/EventDEC/pnwcWord/opt.js +++ b/src/views/EventDEC/pnwcWord/opt.js @@ -4,7 +4,7 @@ * @LastEditTime: 2021-10-29 21:30:46 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit - * @FilePath: /data-show/src/utils/gol/bubbleWord.js + * */ import {compare} from "./dataTool" // 将后台数据转成数组 diff --git a/src/views/MarketingAnalysis/brandSalesRankingTOP10Ranking/index.vue b/src/views/MarketingAnalysis/brandSalesRankingTOP10Ranking/index.vue index d18d776..969c5e4 100644 --- a/src/views/MarketingAnalysis/brandSalesRankingTOP10Ranking/index.vue +++ b/src/views/MarketingAnalysis/brandSalesRankingTOP10Ranking/index.vue @@ -67,7 +67,7 @@ export default {