<!DOCTYPE html>
<!--
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.
-->

<html>
    <head>
        <meta charset='utf-8'>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <script src='lib/jquery.min.js'></script>
        <script src="../dist/echarts.js"></script>
        <script src="lib/testHelper.js"></script>
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
        </style>

        <div id="main0"></div>



        <script>

            function initRawData(count) {
                var M_TAG_LIST = ['MA', 'MB', 'MC', 'MD'];
                var Z_TAG_LIST = ['ZA', 'ZB', 'ZC', 'ZD', 'ZE'];
                var data = [];
                var currDate = +new Date(2015, 2, 1);
                var ONE_DAY = 3600 * 24 * 1000;
                for (var i = 0; i < count; i++, currDate += ONE_DAY) {
                    data.push([
                        currDate,
                        makeRandomValue([10, 40], 0),
                        makeRandomValue([0.01, 0.99], 2),
                        makeRandomValue([1, 10], 1),
                        // makeRandomValue([1000, 9000], 0),
                        // makeRandomValue([1000, 9000], 0),
                        // makeRandomValue([10, 90], 0),
                        M_TAG_LIST[makeRandomValue([0, M_TAG_LIST.length - 1], 0)],
                        Z_TAG_LIST[makeRandomValue([0, Z_TAG_LIST.length - 1], 0)],
                        'P' + i,
                    ]);
                }

                function makeRandomValue(range, precision) {
                    return +(
                        Math.random() * (range[1] - range[0]) + range[0]
                    ).toFixed(precision);
                }

                return data;
            }
        </script>



        <script>

            require([
                'echarts', 'ecStat', 'ecSimpleTransform', 'ecSimpleOptionPlayer'
            ], function (echarts, ecStat, ecSimpleTransform, ecSimpleOptionPlayer) {

                echarts.registerTransform(ecSimpleTransform.aggregate);
                echarts.registerTransform(ecStat.transform.clustering);


                const PIE_COLORS = [
                    '#e06343', '#37a354', '#b55dba', '#b5bd48', '#8378EA', '#96BFFF'
                ];
                const CLUSTER_COLORS = [
                    '#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'
                ];
                const Z_TAG_COLORS = [
                    '#c23531', '#2f4554', '#61a0a8', '#d48265', '#91c7ae', '#749f83',
                    '#ca8622', '#bda29a', '#6e7074', '#546570', '#c4ccd3'
                ];
                const Z_TAG_COLORS_2 = [
                    '#51689b', '#ce5c5c', '#fbc357', '#8fbf8f', '#659d84', '#fb8e6a', '#c77288', '#786090',
                    '#91c4c5', '#6890ba'
                ];
                const SYMBOL_PATHS = [
                    'path://m67.25,28.9c27.42,-69.1 134.84,0 0,88.85c-134.84,-88.85 -27.42,-157.96 0,-88.85z',
                    'path://M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM22 8c1.105 0 2 1.343 2 3s-0.895 3-2 3-2-1.343-2-3 0.895-3 2-3zM10 8c1.105 0 2 1.343 2 3s-0.895 3-2 3-2-1.343-2-3 0.895-3 2-3zM16 28c-5.215 0-9.544-4.371-10-9.947 2.93 1.691 6.377 2.658 10 2.658s7.070-0.963 10-2.654c-0.455 5.576-4.785 9.942-10 9.942z',
                    'path://M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16c8.837 0 16-7.163 16-16s-7.163-16-16-16zM22 7.375c1.999 0 3.625 1.626 3.625 3.625 0 0.199-0.017 0.402-0.051 0.604-0.051 0.301-0.311 0.521-0.616 0.521s-0.566-0.22-0.616-0.522c-0.192-1.146-1.177-1.666-2.341-1.666s-2.149 0.52-2.341 1.666c-0.050 0.301-0.311 0.522-0.616 0.522-0 0 0 0-0 0-0.305 0-0.566-0.22-0.616-0.521-0.034-0.201-0.051-0.404-0.051-0.604 0-1.999 1.626-3.625 3.625-3.625zM10 7.375c1.999 0 3.625 1.626 3.625 3.625 0 0.199-0.017 0.402-0.051 0.604-0.051 0.301-0.311 0.521-0.616 0.521s-0.566-0.22-0.616-0.522c-0.193-1.146-1.177-1.666-2.341-1.666s-2.149 0.52-2.341 1.666c-0.051 0.301-0.311 0.522-0.616 0.522 0 0 0 0 0 0-0.305 0-0.566-0.22-0.616-0.521-0.034-0.201-0.051-0.404-0.051-0.604 0-1.999 1.626-3.625 3.625-3.625zM6 18h6v7.745c-3.44-0.894-6-4.035-6-7.745zM14 26v-8h4v8h-4zM20 25.745v-7.745h6c0 3.71-2.559 6.851-6 7.745z',
                    'path://M23.6 2c4.637 0 8.4 3.764 8.4 8.401 0 9.132-9.87 11.964-15.999 21.232-6.485-9.326-16.001-11.799-16.001-21.232 0-4.637 3.763-8.401 8.4-8.401 1.886 0 3.625 0.86 5.025 2.12l-2.425 3.88 7 4-4 10 11-12-7-4 1.934-2.901c1.107-0.68 2.35-1.099 3.665-1.099z',
                    'path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z',
                    'path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z  M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z'
                ];
                var CONTENT_COLOR = '#37A2DA';
                var ANIMATION_DURATION_UPDATE = 1500;


                // var rawData = initRawData(COUNT);
                // console.log(JSON.stringify(rawData));
                var rawData = [[1425139200000,34,0.13,2,"MD","ZD","P0"],[1425225600000,28,0.71,1.5,"MB","ZD","P1"],[1425312000000,23,0.9,2.8,"MA","ZC","P2"],[1425398400000,21,0.58,6,"MB","ZC","P3"],[1425484800000,14,0.1,1.6,"MC","ZA","P4"],[1425571200000,21,0.6,7.7,"MC","ZA","P5"],[1425657600000,23,0.31,2.6,"MC","ZC","P6"],[1425744000000,34,0.74,2.4,"MD","ZE","P7"],[1425830400000,14,0.59,2.3,"MB","ZD","P8"],[1425916800000,18,0.85,5.1,"MB","ZB","P9"],[1426003200000,36,0.96,1.2,"MC","ZC","P10"],[1426089600000,18,0.28,2.5,"MA","ZC","P11"],[1426176000000,20,0.62,6,"MB","ZD","P12"],[1426262400000,32,0.79,1.7,"MB","ZA","P13"],[1426348800000,17,0.58,4.4,"MD","ZB","P14"],[1426435200000,23,0.77,3,"MB","ZA","P15"],[1426521600000,39,0.87,4.6,"MC","ZA","P16"],[1426608000000,15,0.7,6,"MB","ZC","P17"],[1426694400000,21,0.94,2.7,"MB","ZD","P18"],[1426780800000,28,0.48,4.5,"MC","ZC","P19"],[1426867200000,31,0.49,9.8,"MA","ZC","P20"],[1426953600000,27,0.87,7.7,"MB","ZB","P21"],[1427040000000,27,0.82,5.5,"MC","ZB","P22"],[1427126400000,11,0.53,2.7,"MD","ZC","P23"],[1427212800000,13,0.7,7.6,"MB","ZD","P24"],[1427299200000,39,0.99,4.8,"MB","ZD","P25"],[1427385600000,32,0.91,2.1,"MB","ZE","P26"],[1427472000000,20,0.97,5,"MB","ZA","P27"],[1427558400000,36,0.01,8.9,"MB","ZD","P28"],[1427644800000,22,0.08,9.2,"MB","ZE","P29"],[1427731200000,21,0.36,3.1,"MD","ZC","P30"],[1427817600000,11,0.15,5.8,"MD","ZB","P31"],[1427904000000,39,0.02,1.4,"MC","ZD","P32"],[1427990400000,20,0.86,8.7,"MB","ZD","P33"],[1428076800000,23,0.24,7.2,"MD","ZB","P34"],[1428163200000,12,0.06,2,"MD","ZB","P35"],[1428249600000,36,0.42,8.2,"MA","ZB","P36"],[1428336000000,17,0.48,7.5,"MB","ZC","P37"],[1428422400000,19,0.12,6.6,"MB","ZB","P38"],[1428508800000,39,0.58,3.1,"MC","ZE","P39"],[1428595200000,10,0.18,6.6,"MC","ZD","P40"],[1428681600000,22,0.28,2.1,"MB","ZE","P41"],[1428768000000,27,0.33,1.9,"MC","ZB","P42"],[1428854400000,37,0.46,9.4,"MD","ZE","P43"],[1428940800000,18,0.96,5.5,"MB","ZA","P44"],[1429027200000,11,0.61,8.2,"MD","ZC","P45"],[1429113600000,15,0.88,4.6,"MD","ZA","P46"],[1429200000000,38,0.89,7.2,"MD","ZC","P47"],[1429286400000,20,0.39,5.4,"MB","ZB","P48"],[1429372800000,30,0.71,5.5,"MA","ZA","P49"]];

                var RAW_DATA_DIMENSIONS = ['DATE', 'ATA', 'STE', 'CTZ', 'M_TAG', 'Z_TAG', 'ID'];
                var M_TAG_SUM_DIMENSIONS = ['ATA', 'STE', 'CTZ', 'M_TAG'];
                var RAW_CLUSTER_DIMENSIONS = ['DATE', 'ATA', 'STE', 'CTZ', 'M_TAG', 'Z_TAG', 'ID', 'CLUSTER_IDX', 'CLUSTER_CENTER_ATA', 'CLUSTER_CENTER_STE'];
                var RAW_CLUSTER_CENTERS_DIMENSIONS = ['COUNT', 'CLUSTER_IDX', 'CLUSTER_CENTER_ATA', 'CLUSTER_CENTER_STE'];


                function getFromPalette(value, palette) {
                    if (!palette.__colorMap) {
                        palette.__colorMap = {};
                    }
                    if (palette.__colorIdx == null) {
                        palette.__colorIdx = 0;
                    }
                    if (!palette.__colorMap[value]) {
                        palette.__colorMap[value] = palette[palette.__colorIdx];
                        palette.__colorIdx++;
                        if (palette.__colorIdx >= palette.length) {
                            palette.__colorIdx = 0;
                        }
                    }
                    return palette.__colorMap[value];
                }



                var baseOption = {
                    dataset: [{
                        id: 'raw',
                        dimensions: RAW_DATA_DIMENSIONS,
                        source: rawData
                    }, {
                        id: 'mTagSum',
                        fromDatasetId: 'raw',
                        transform: {
                            type: 'ecSimpleTransform:aggregate',
                            config: {
                                resultDimensions: [
                                    { from: 'ATA', method: 'sum' },
                                    { from: 'STE', method: 'sum' },
                                    { from: 'CTZ', method: 'sum' },
                                    { from: 'M_TAG' }
                                ],
                                groupBy: 'M_TAG'
                            }
                        }
                    }, {
                        id: 'rawClusters',
                        fromDatasetId: 'raw',
                        transform: {
                            type: 'ecStat:clustering',
                            print: true,
                            config: {
                                clusterCount: 4,
                                dimensions: ['ATA', 'STE'],
                                outputClusterIndexDimension: {
                                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_IDX'),
                                    name: 'CLUSTER_IDX'
                                },
                                outputCentroidDimensions: [{
                                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_CENTER_ATA'),
                                    name: 'CLUSTER_CENTER_ATA'
                                }, {
                                    index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_CENTER_STE'),
                                    name: 'CLUSTER_CENTER_STE'
                                }]
                            }
                        }
                    }, {
                        id: 'rawClusterCenters',
                        fromDatasetId: 'rawClusters',
                        transform: {
                            type: 'ecSimpleTransform:aggregate',
                            print: true,
                            config: {
                                resultDimensions: [
                                    { name: 'COUNT', from: 'ATA', method: 'count' },
                                    { from: 'CLUSTER_CENTER_ATA' },
                                    { from: 'CLUSTER_CENTER_STE' },
                                    { from: 'CLUSTER_IDX' }
                                ],
                                groupBy: 'CLUSTER_IDX'
                            }
                        }
                    }],
                    tooltip: {}
                };


                var AXIS_STYLE = {
                    splitLine: {
                        lineStyle: {
                            color: '#333'
                        }
                    },
                    axisLine: {
                        lineStyle: {
                            color: '#777'
                        }
                    },
                    axisLabel: {
                        color: '#999',
                        fontSize: 20,
                        fontFamily: 'Lato'
                    }
                };
                var BG_COLOR = '#000';



                function makeScatterOptionCreator(renderItem) {
                    return function () {
                        var datasetId = 'rawClusters';
                        return {
                            datasetId: datasetId,
                            option: {
                                backgroundColor: BG_COLOR,
                                grid: {
                                    containLabel: true
                                },
                                xAxis: {
                                    name: 'STE',
                                    ...AXIS_STYLE
                                },
                                yAxis: {
                                    name: 'ATA',
                                    ...AXIS_STYLE
                                },
                                dataZoom: [{
                                    type: 'slider',
                                }, {
                                    type: 'inside'
                                }],
                                series: {
                                    type: 'custom',
                                    coordinateSystem: 'cartesian2d',
                                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
                                    datasetId: datasetId,
                                    universalTransition: {
                                        enabled: true
                                    },
                                    encode: {
                                        itemName: 'ID',
                                        x: 'STE',
                                        y: 'ATA',
                                        tooltip: ['STE', 'ATA']
                                    },
                                    renderItem: renderItem
                                }
                            }
                        }
                    };
                }


                var optionCreators = {

                    'Scatter_circle_ATA_STE': makeScatterOptionCreator(
                        function (params, api) {
                            var pos = api.coord([
                                api.value('STE'),
                                api.value('ATA')
                            ]);
                            var zTagVal = api.value('Z_TAG');
                            var color = getFromPalette(zTagVal, Z_TAG_COLORS);
                            var symbolPath = getFromPalette(zTagVal, SYMBOL_PATHS);
                            return {
                                type: 'circle',
                                shape: {
                                    cx: pos[0],
                                    cy: pos[1],
                                    r: 10
                                },
                                style: {
                                    fill: color
                                },
                                transition: ['shape', 'style']
                            };
                        }
                    ),

                    'Scatter_singleSVG_ATA_STE': makeScatterOptionCreator(
                        function (params, api) {
                            var pos = api.coord([
                                api.value('STE'),
                                api.value('ATA')
                            ]);
                            var zTagVal = api.value('Z_TAG');
                            var color = getFromPalette(zTagVal, Z_TAG_COLORS);
                            var symbolPath = getFromPalette(zTagVal, SYMBOL_PATHS);
                            return {
                                type: 'path',
                                x: pos[0],
                                y: pos[1],
                                shape: {
                                    pathData: symbolPath,
                                    width: 40,
                                    height: 40
                                },
                                style: {
                                    fill: color
                                },
                                transition: ['style']
                            };
                        }
                    ),

                    'Scatter_groupShape_ATA_STE': makeScatterOptionCreator(
                        function (params, api) {
                            var pos = api.coord([
                                api.value('STE'),
                                api.value('ATA')
                            ]);
                            var zTagVal = api.value('Z_TAG');
                            var color1 = getFromPalette(zTagVal, Z_TAG_COLORS);
                            var color2 = getFromPalette(zTagVal, Z_TAG_COLORS_2);
                            return {
                                type: 'group',
                                x: pos[0],
                                y: pos[1],
                                children: [{
                                    type: 'polygon',
                                    shape: {
                                        points: [
                                            [-40, -2],
                                            [40, -2],
                                            [0, -35]
                                        ]
                                    },
                                    style: {
                                        fill: color1,
                                        stroke: '#333',
                                        lineWidth: 1
                                    },
                                    transition: ['shape', 'style']
                                }, {
                                    type: 'rect',
                                    shape: {
                                        x: -20,
                                        y: 0,
                                        width: 40,
                                        height: 30
                                    },
                                    style: {
                                        fill: color2,
                                        stroke: '#333',
                                        lineWidth: 1
                                    },
                                    transition: ['shape', 'style']
                                }]
                            };
                        }
                    ),

                    'Bar_mSum_ATA': function () {
                        var datasetId = 'mTagSum'
                        return {
                            datasetId: datasetId,
                            option: {
                                backgroundColor: BG_COLOR,
                                grid: {
                                    containLabel: true
                                },
                                xAxis: {
                                    type: 'category',
                                    ...AXIS_STYLE
                                },
                                yAxis: {
                                    ...AXIS_STYLE
                                },
                                dataZoom: [{
                                    type: 'slider',
                                }, {
                                    type: 'inside'
                                }],
                                series: {
                                    type: 'custom',
                                    coordinateSystem: 'cartesian2d',
                                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
                                    datasetId: datasetId,
                                    universalTransition: {
                                        enabled: true
                                    },
                                    encode: {
                                        x: 'M_TAG',
                                        y: 'ATA',
                                        itemGroupId: 'M_TAG',
                                        tooltip: ['M_TAG', 'ATA']
                                    },
                                    renderItem: function (params, api) {
                                        var mTagVal = api.value('M_TAG');
                                        var ataVal = api.value('ATA');
                                        var tarPos = api.coord([mTagVal, ataVal]);
                                        var zeroPos = api.coord([mTagVal, 0]);
                                        var size = api.size([mTagVal, ataVal]);
                                        var width = size[0] * 0.4;
                                        return {
                                            type: 'rect',
                                            shape: {
                                                x: tarPos[0] - width / 2,
                                                y: tarPos[1],
                                                height: zeroPos[1] - tarPos[1],
                                                width: width,
                                            },
                                            style: {
                                                fill: CONTENT_COLOR,
                                                stroke: '#555',
                                                lineWidth: 0
                                            },
                                            transition: ['shape', 'style']
                                        };
                                    }
                                }
                            }
                        };
                    },

                    'Pie_mSum_ATA': function () {
                        var datasetId = 'mTagSum';
                        return {
                            datasetId: datasetId,
                            option: {
                                backgroundColor: BG_COLOR,
                                series: {
                                    type: 'custom',
                                    coordinateSystem: 'none',
                                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
                                    datasetId: datasetId,
                                    encode: {
                                        itemName: 'M_TAG',
                                        value: 'ATA',
                                        tooltip: 'ATA'
                                    },
                                    universalTransition: {
                                        enabled: true
                                    },
                                    renderItem: function (params, api) {
                                        var context = params.context;
                                        if (!context.layout) {
                                            context.layout = true;
                                            var totalValue = 0;
                                            for (var i = 0; i < params.dataInsideLength; i++) {
                                                totalValue += api.value('ATA', i);
                                            }
                                            var angles = [];
                                            var colors = [];
                                            var currentAngle = -Math.PI / 2;
                                            for (var i = 0; i < params.dataInsideLength; i++) {
                                                colors.push(PIE_COLORS[i]);
                                                var angle = api.value('ATA', i) / totalValue * Math.PI * 2;
                                                angles.push([currentAngle, angle + currentAngle - 0.01]);
                                                currentAngle += angle;
                                            }
                                            context.angles = angles;
                                            context.colors = colors;
                                        }

                                        var width = chart.getWidth();
                                        var height = chart.getHeight();
                                        return {
                                            type: 'sector',
                                            shape: {
                                                cx: width / 2,
                                                cy: height / 2,
                                                r: Math.min(width, height) / 3,
                                                r0: Math.min(width, height) / 5,
                                                startAngle: context.angles[params.dataIndex][0],
                                                endAngle: context.angles[params.dataIndex][1],
                                                clockwise: true
                                            },
                                            style: {
                                                // fill: CONTENT_COLOR,
                                                fill: context.colors[params.dataIndex],
                                                stroke: '#555',
                                                lineWidth: 0,
                                                strokeNoScale: true
                                            },
                                            transition: ['shape', 'style']
                                        };
                                    }
                                }
                            }
                        };
                    },

                    'Scatter_ATA_STE_Cluster_Center': function () {
                        var datasetId = 'rawClusterCenters';
                        return {
                            datasetId: datasetId,
                            option: {
                                backgroundColor: BG_COLOR,
                                grid: {
                                    containLabel: true
                                },
                                xAxis: {
                                    name: 'STE',
                                    ...AXIS_STYLE
                                },
                                yAxis: {
                                    name: 'ATA',
                                    ...AXIS_STYLE
                                },
                                dataZoom: [{
                                    type: 'slider',
                                }, {
                                    type: 'inside'
                                }],
                                series: {
                                    type: 'custom',
                                    coordinateSystem: 'cartesian2d',
                                    animationDurationUpdate: ANIMATION_DURATION_UPDATE,
                                    datasetId: datasetId,
                                    universalTransition: {
                                        enabled: true
                                    },
                                    encode: {
                                        x: 'CLUSTER_CENTER_STE',
                                        y: 'CLUSTER_CENTER_ATA',
                                        itemGroupId: 'CLUSTER_IDX',
                                        tooltip: ['CLUSTER_CENTER_STE', 'CLUSTER_CENTER_ATA']
                                    },
                                    renderItem: function (params, api) {
                                        var context = params.context;
                                        if (!context.layout) {
                                            context.layout = true;
                                            context.totalCount = 0;
                                            for (var i = 0; i < params.dataInsideLength; i++) {
                                                context.totalCount += api.value('COUNT', i);
                                            }
                                        }

                                        var pos = api.coord([
                                            api.value('CLUSTER_CENTER_STE'),
                                            api.value('CLUSTER_CENTER_ATA')
                                        ]);
                                        var count = api.value('COUNT');
                                        var radius = count / context.totalCount * 100 + 10;
                                        return {
                                            type: 'circle',
                                            shape: {
                                                cx: pos[0],
                                                cy: pos[1],
                                                r: radius,
                                            },
                                            style: {
                                                // fill: CONTENT_COLOR,
                                                fill: CLUSTER_COLORS[params.dataIndex],
                                                stroke: '#555',
                                                lineWidth: 0
                                            },
                                            transition: ['shape', 'style']
                                        };
                                    }
                                }
                            }
                        };
                    }
                };



                var options = {};
                var buttons = [];

                echarts.util.each(optionCreators, function (creator, key) {
                    var optionWrap = creator();
                    options[key] = Object.assign({}, baseOption, optionWrap.option);
                    buttons.push({
                        text: key,
                        onclick: function () {
                            chart.setOption(options[key], true);
                        }
                    });
                });

                var chart = testHelper.create(echarts, 'main0', {
                    title: [
                        'Test: buttons, should morph animation combine/separate.',
                        'Test: click buttons **before animation finished**, should no blink.',
                        'Test: click buttons **twice**, should no blink.',
                        'Test: use dataZoom, the "update animation" should exist'
                    ],
                    option: options['Scatter_singleSVG_ATA_STE'],
                    lazyUpdate: true,
                    height: 600,
                    buttons: buttons.concat([{
                        text: 'resizeToSmall',
                        onclick: function () {
                            chart.resize({
                                width: 300,
                                height: 400
                            });
                        }
                    }, {
                        text: 'resizeToNormal',
                        onclick: function () {
                            chart.resize({
                                width: 'auto',
                                height: 600
                            });
                        }
                    }])
                });

            });

        </script>



    </body>
</html>