| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 | define('echarts/chart/eventRiver', [    'require',    './base',    '../layout/eventRiver',    'zrender/shape/Polygon',    '../component/axis',    '../component/grid',    '../component/dataZoom',    '../config',    '../util/ecData',    '../util/date',    'zrender/tool/util',    'zrender/tool/color',    '../chart'], function (require) {    var ChartBase = require('./base');    var eventRiverLayout = require('../layout/eventRiver');    var PolygonShape = require('zrender/shape/Polygon');    require('../component/axis');    require('../component/grid');    require('../component/dataZoom');    var ecConfig = require('../config');    ecConfig.eventRiver = {        zlevel: 0,        z: 2,        clickable: true,        legendHoverLink: true,        itemStyle: {            normal: {                borderColor: 'rgba(0,0,0,0)',                borderWidth: 1,                label: {                    show: true,                    position: 'inside',                    formatter: '{b}'                }            },            emphasis: {                borderColor: 'rgba(0,0,0,0)',                borderWidth: 1,                label: { show: true }            }        }    };    var ecData = require('../util/ecData');    var ecDate = require('../util/date');    var zrUtil = require('zrender/tool/util');    var zrColor = require('zrender/tool/color');    function EventRiver(ecTheme, messageCenter, zr, option, myChart) {        ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart);        var self = this;        self._ondragend = function () {            self.isDragend = true;        };        this.refresh(option);    }    EventRiver.prototype = {        type: ecConfig.CHART_TYPE_EVENTRIVER,        _buildShape: function () {            var series = this.series;            this.selectedMap = {};            this._dataPreprocessing();            var legend = this.component.legend;            var eventRiverSeries = [];            for (var i = 0; i < series.length; i++) {                if (series[i].type === this.type) {                    series[i] = this.reformOption(series[i]);                    this.legendHoverLink = series[i].legendHoverLink || this.legendHoverLink;                    var serieName = series[i].name || '';                    this.selectedMap[serieName] = legend ? legend.isSelected(serieName) : true;                    if (!this.selectedMap[serieName]) {                        continue;                    }                    this.buildMark(i);                    eventRiverSeries.push(this.series[i]);                }            }            eventRiverLayout(eventRiverSeries, this._intervalX, this.component.grid.getArea());            this._drawEventRiver();            this.addShapeList();        },        _dataPreprocessing: function () {            var series = this.series;            var xAxis;            var evolutionList;            for (var i = 0, iLen = series.length; i < iLen; i++) {                if (series[i].type === this.type) {                    xAxis = this.component.xAxis.getAxis(series[i].xAxisIndex || 0);                    for (var j = 0, jLen = series[i].data.length; j < jLen; j++) {                        evolutionList = series[i].data[j].evolution;                        for (var k = 0, kLen = evolutionList.length; k < kLen; k++) {                            evolutionList[k].timeScale = xAxis.getCoord(ecDate.getNewDate(evolutionList[k].time) - 0);                            evolutionList[k].valueScale = Math.pow(evolutionList[k].value, 0.8);                        }                    }                }            }            this._intervalX = Math.round(this.component.grid.getWidth() / 40);        },        _drawEventRiver: function () {            var series = this.series;            for (var i = 0; i < series.length; i++) {                var serieName = series[i].name || '';                if (series[i].type === this.type && this.selectedMap[serieName]) {                    for (var j = 0; j < series[i].data.length; j++) {                        this._drawEventBubble(series[i].data[j], i, j);                    }                }            }        },        _drawEventBubble: function (oneEvent, seriesIndex, dataIndex) {            var series = this.series;            var serie = series[seriesIndex];            var serieName = serie.name || '';            var data = serie.data[dataIndex];            var queryTarget = [                data,                serie            ];            var legend = this.component.legend;            var defaultColor = legend ? legend.getColor(serieName) : this.zr.getColor(seriesIndex);            var normal = this.deepMerge(queryTarget, 'itemStyle.normal') || {};            var emphasis = this.deepMerge(queryTarget, 'itemStyle.emphasis') || {};            var normalColor = this.getItemStyleColor(normal.color, seriesIndex, dataIndex, data) || defaultColor;            var emphasisColor = this.getItemStyleColor(emphasis.color, seriesIndex, dataIndex, data) || (typeof normalColor === 'string' ? zrColor.lift(normalColor, -0.2) : normalColor);            var pts = this._calculateControlPoints(oneEvent);            var eventBubbleShape = {                zlevel: this.getZlevelBase(),                z: this.getZBase(),                clickable: this.deepQuery(queryTarget, 'clickable'),                style: {                    pointList: pts,                    smooth: 'spline',                    brushType: 'both',                    lineJoin: 'round',                    color: normalColor,                    lineWidth: normal.borderWidth,                    strokeColor: normal.borderColor                },                highlightStyle: {                    color: emphasisColor,                    lineWidth: emphasis.borderWidth,                    strokeColor: emphasis.borderColor                },                draggable: 'vertical',                ondragend: this._ondragend            };            eventBubbleShape = new PolygonShape(eventBubbleShape);            this.addLabel(eventBubbleShape, serie, data, oneEvent.name);            ecData.pack(eventBubbleShape, series[seriesIndex], seriesIndex, series[seriesIndex].data[dataIndex], dataIndex, series[seriesIndex].data[dataIndex].name);            this.shapeList.push(eventBubbleShape);        },        _calculateControlPoints: function (oneEvent) {            var intervalX = this._intervalX;            var posY = oneEvent.y;            var evolution = oneEvent.evolution;            var n = evolution.length;            if (n < 1) {                return;            }            var time = [];            var value = [];            for (var i = 0; i < n; i++) {                time.push(evolution[i].timeScale);                value.push(evolution[i].valueScale);            }            var pts = [];            pts.push([                time[0],                posY            ]);            var i = 0;            for (i = 0; i < n - 1; i++) {                pts.push([                    (time[i] + time[i + 1]) / 2,                    value[i] / -2 + posY                ]);            }            pts.push([                (time[i] + (time[i] + intervalX)) / 2,                value[i] / -2 + posY            ]);            pts.push([                time[i] + intervalX,                posY            ]);            pts.push([                (time[i] + (time[i] + intervalX)) / 2,                value[i] / 2 + posY            ]);            for (i = n - 1; i > 0; i--) {                pts.push([                    (time[i] + time[i - 1]) / 2,                    value[i - 1] / 2 + posY                ]);            }            return pts;        },        ondragend: function (param, status) {            if (!this.isDragend || !param.target) {                return;            }            status.dragOut = true;            status.dragIn = true;            status.needRefresh = false;            this.isDragend = false;        },        refresh: function (newOption) {            if (newOption) {                this.option = newOption;                this.series = newOption.series;            }            this.backupShapeList();            this._buildShape();        }    };    zrUtil.inherits(EventRiver, ChartBase);    require('../chart').define('eventRiver', EventRiver);    return EventRiver;});define('echarts/layout/eventRiver', ['require'], function (require) {    function eventRiverLayout(series, intervalX, area) {        var space = 5;        var scale = intervalX;        function importanceSort(a, b) {            var x = a.importance;            var y = b.importance;            return x > y ? -1 : x < y ? 1 : 0;        }        function indexOf(array, value) {            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;        }        for (var i = 0; i < series.length; i++) {            for (var j = 0; j < series[i].data.length; j++) {                if (series[i].data[j].weight == null) {                    series[i].data[j].weight = 1;                }                var importance = 0;                for (var k = 0; k < series[i].data[j].evolution.length; k++) {                    importance += series[i].data[j].evolution[k].valueScale;                }                series[i].data[j].importance = importance * series[i].data[j].weight;            }            series[i].data.sort(importanceSort);        }        for (var i = 0; i < series.length; i++) {            if (series[i].weight == null) {                series[i].weight = 1;            }            var importance = 0;            for (var j = 0; j < series[i].data.length; j++) {                importance += series[i].data[j].weight;            }            series[i].importance = importance * series[i].weight;        }        series.sort(importanceSort);        var minTime = Number.MAX_VALUE;        var maxTime = 0;        for (var i = 0; i < series.length; i++) {            for (var j = 0; j < series[i].data.length; j++) {                for (var k = 0; k < series[i].data[j].evolution.length; k++) {                    var time = series[i].data[j].evolution[k].timeScale;                    minTime = Math.min(minTime, time);                    maxTime = Math.max(maxTime, time);                }            }        }        var root = segmentTreeBuild(Math.floor(minTime), Math.ceil(maxTime));        var totalMaxY = 0;        for (var i = 0; i < series.length; i++) {            for (var j = 0; j < series[i].data.length; j++) {                var e = series[i].data[j];                e.time = [];                e.value = [];                for (var k = 0; k < series[i].data[j].evolution.length; k++) {                    e.time.push(series[i].data[j].evolution[k].timeScale);                    e.value.push(series[i].data[j].evolution[k].valueScale);                }                var mxIndex = indexOf(e.value, Math.max.apply(Math, e.value));                var maxY = segmentTreeQuery(root, e.time[mxIndex], e.time[mxIndex + 1]);                var k = 0;                e.y = maxY + e.value[mxIndex] / 2 + space;                for (k = 0; k < e.time.length - 1; k++) {                    var curMaxY = segmentTreeQuery(root, e.time[k], e.time[k + 1]);                    if (e.y - e.value[k] / 2 - space < curMaxY) {                        e.y = curMaxY + e.value[k] / 2 + space;                    }                }                var curMaxY = segmentTreeQuery(root, e.time[k], e.time[k] + scale);                if (e.y - e.value[k] / 2 - space < curMaxY) {                    e.y = curMaxY + e.value[k] / 2 + space;                }                series[i].y = e.y;                totalMaxY = Math.max(totalMaxY, e.y + e.value[mxIndex] / 2);                for (k = 0; k < e.time.length - 1; k++) {                    segmentTreeInsert(root, e.time[k], e.time[k + 1], e.y + e.value[k] / 2);                }                segmentTreeInsert(root, e.time[k], e.time[k] + scale, e.y + e.value[k] / 2);            }        }        scaleY(series, area, totalMaxY, space);    }    function scaleY(series, area, maxY, space) {        var yBase = area.y;        var yScale = (area.height - space) / maxY;        for (var i = 0; i < series.length; i++) {            series[i].y = series[i].y * yScale + yBase;            var eventList = series[i].data;            for (var j = 0; j < eventList.length; j++) {                eventList[j].y = eventList[j].y * yScale + yBase;                var evolutionList = eventList[j].evolution;                for (var k = 0; k < evolutionList.length; k++) {                    evolutionList[k].valueScale *= yScale * 1;                }            }        }    }    function segmentTreeBuild(left, right) {        var root = {            'left': left,            'right': right,            'leftChild': null,            'rightChild': null,            'maxValue': 0        };        if (left + 1 < right) {            var mid = Math.round((left + right) / 2);            root.leftChild = segmentTreeBuild(left, mid);            root.rightChild = segmentTreeBuild(mid, right);        }        return root;    }    function segmentTreeQuery(root, left, right) {        if (right - left < 1) {            return 0;        }        var mid = Math.round((root.left + root.right) / 2);        var result = 0;        if (left == root.left && right == root.right) {            result = root.maxValue;        } else if (right <= mid && root.leftChild != null) {            result = segmentTreeQuery(root.leftChild, left, right);        } else if (left >= mid && root.rightChild != null) {            result = segmentTreeQuery(root.rightChild, left, right);        } else {            var leftValue = 0;            var rightValue = 0;            if (root.leftChild != null) {                leftValue = segmentTreeQuery(root.leftChild, left, mid);            }            if (root.rightChild != null) {                rightValue = segmentTreeQuery(root.rightChild, mid, right);            }            result = leftValue > rightValue ? leftValue : rightValue;        }        return result;    }    function segmentTreeInsert(root, left, right, value) {        if (root == null) {            return;        }        var mid = Math.round((root.left + root.right) / 2);        root.maxValue = root.maxValue > value ? root.maxValue : value;        if (Math.floor(left * 10) == Math.floor(root.left * 10) && Math.floor(right * 10) == Math.floor(root.right * 10)) {            return;        } else if (right <= mid) {            segmentTreeInsert(root.leftChild, left, right, value);        } else if (left >= mid) {            segmentTreeInsert(root.rightChild, left, right, value);        } else {            segmentTreeInsert(root.leftChild, left, mid, value);            segmentTreeInsert(root.rightChild, mid, right, value);        }    }    return eventRiverLayout;});
 |