
<!--
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">
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/testHelper.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
            h1 {
                line-height: 60px;
                height: 60px;
                background: #ddd;
                text-align: center;
                font-weight: bold;
                font-size: 14px;
            }
            .chart {
                height: 500px;
            }
        </style>


        <h1>Profile</h1>
        <div class="chart" id="profile"></div>
        <h1>Histogram</h1>
        <div class="chart" id="histogram"></div>
        <h1>Profit</h1>
        <div class="chart" id="profit"></div>
        <h1>Error Chart (Cartesian Bar)</h1>
        <div class="chart" id="errorChart-cartesian-bar"></div>
        <h1>Error Chart (Cartesian Scatter)</h1>
        <div class="chart" id="errorChart-cartesian-scatter"></div>
        <h1>Bar layout</h1>
        <div class="chart" id="errorChart-cartesian-bar-multi"></div>
        <h1>Cartesian Polygon</h1>
        <div class="chart" id="cartesian-polygon"></div>
        <h1>Calendar | Path data | text</h1>
        <div class="chart" id="calendar"></div>
        <h1>Update animation: Text | Image | Path </h1>
        <div class="chart" id="text-image-update"></div>
        <h1>Polar Block</h1>
        <div class="chart" id="polar-block"></div>
        <h1>Diff group children by name (animation of number icon should be normal)</h1>
        <div class="chart" id="diff-children-by-name"></div>







        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                var data = [];
                var dataCount = 10;
                var startTime = +new Date();
                var categories = ['categoryA', 'categoryB', 'categoryC'];
                var types = [
                    {name: 'JS Heap', color: '#7b9ce1'},
                    {name: 'Documents', color: '#bd6d6c'},
                    {name: 'Nodes', color: '#75d874'},
                    {name: 'Listeners', color: '#e0bc78'},
                    {name: 'GPU Memory', color: '#dc77dc'},
                    {name: 'GPU', color: '#72b362'}
                ];

                // Generate mock data
                echarts.util.each(categories, function (category, index) {
                    var baseTime = startTime;
                    for (var i = 0; i < dataCount; i++) {
                        var typeItem = types[Math.round(Math.random() * (types.length - 1))];
                        var duration = Math.round(Math.random() * 10000);
                        data.push({
                            name: typeItem.name,
                            value: [
                                index,
                                baseTime,
                                baseTime += duration,
                                duration
                            ],
                            itemStyle: {
                                normal: {
                                    color: typeItem.color
                                }
                            }
                        });
                        baseTime += Math.round(Math.random() * 2000);
                    }
                });

                console.log(JSON.stringify({
                    startTime: startTime,
                    data: data
                }));

                function renderItem(params, api) {
                    var categoryIndex = api.value(0);
                    var start = api.coord([api.value(1), categoryIndex]);
                    var end = api.coord([api.value(2), categoryIndex]);
                    var height = api.size([0, 1])[1] * 0.6;

                    var rectShape = echarts.graphic.clipRectByRect({
                        x: start[0],
                        y: start[1] - height / 2,
                        width: end[0] - start[0],
                        height: height
                    }, {
                        x: params.coordSys.x,
                        y: params.coordSys.y,
                        width: params.coordSys.width,
                        height: params.coordSys.height
                    });

                    return rectShape && {
                        type: 'rect',
                        shape: rectShape,
                        style: api.style()
                    };
                }

                option = {
                    tooltip: {
                        formatter: function (params) {
                            return params.marker + params.name + ': ' + params.value[3] + ' ms';
                        }
                    },
                    title: {
                        text: 'Profile',
                        left: 'center'
                    },
                    legend: {
                        data: ['bar', 'error']
                    },
                    dataZoom: [{
                        type: 'slider',
                        filterMode: 'weakFilter',
                        showDataShadow: false,
                        top: 400,
                        height: 10,
                        borderColor: 'transparent',
                        backgroundColor: '#e2e2e2',
                        handleIcon: 'M10.7,11.9H9.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', // jshint ignore:line
                        handleSize: 20,
                        handleStyle: {
                            shadowBlur: 6,
                            shadowOffsetX: 1,
                            shadowOffsetY: 2,
                            shadowColor: '#aaa'
                        },
                        labelFormatter: function (val) {
                            return (val - startTime).toFixed(0) + ' ms';
                        }
                    }, {
                        type: 'inside',
                        filterMode: 'weakFilter'
                    }],
                    grid: {
                        height:300
                    },
                    xAxis: {
                        min: startTime,
                        scale: true,
                        axisLabel: {
                            formatter: function (val) {
                                return (val - startTime) + ' ms';
                            }
                        }
                    },
                    yAxis: {
                        data: categories
                    },
                    series: [{
                        type: 'custom',
                        renderItem: renderItem,
                        itemStyle: {
                            normal: {
                                opacity: 0.8
                            }
                        },
                        encode: {
                            x: [1, 2],
                            y: 0
                        },
                        data: data
                    }]
                };

                testHelper.createChart(echarts, 'profile', option);
            });
        </script>















        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                // See https://github.com/ecomfe/echarts-stat
                // var bins = {"bins":[{"sample":[8.3,8.6,8.8],"x0":8,"x1":10},{"sample":[10.5,10.7,10.8,11,11,11.1,11.2,11.3,11.4,11.4,11.7],"x0":10,"x1":12},{"sample":[12,12.9,12.9,13.3,13.7,13.8],"x0":12,"x1":14},{"sample":[14,14.2,14.5],"x0":14,"x1":16},{"sample":[16,16.3,17.3,17.5,17.9],"x0":16,"x1":18},{"sample":[18,18],"x0":18,"x1":20},{"sample":[20.6],"x0":20,"x1":22}],"data":[[9,3],[11,11],[13,6],[15,3],[17,5],[19,2],[21,1]]};
                var bins = {"bins":[{"sample":[],"x0":0.5,"x1":1},{"sample":[1.4,1.4,1.3,1.4,1.4,1.4,1.4,1.1,1.2,1.3,1.4,1,1.4,1.4,1.2,1.3,1.4,1.3,1.3,1.3,1.3,1.4,1.4,1.4],"x0":1,"x1":1.5},{"sample":[1.5,1.7,1.5,1.5,1.5,1.6,1.5,1.7,1.5,1.7,1.5,1.7,1.9,1.6,1.6,1.5,1.6,1.6,1.5,1.5,1.5,1.5,1.6,1.9,1.6,1.5],"x0":1.5,"x1":2},{"sample":[],"x0":2,"x1":2.5},{"sample":[],"x0":2.5,"x1":3},{"sample":[3.3,3.3,3],"x0":3,"x1":3.5},{"sample":[3.9,3.5,3.6,3.9,3.5,3.8,3.7,3.9],"x0":3.5,"x1":4},{"sample":[4,4.2,4,4.4,4.1,4,4.3,4.4,4.4,4.1,4,4.4,4,4.2,4.2,4.2,4.3,4.1],"x0":4,"x1":4.5},{"sample":[4.7,4.5,4.9,4.6,4.5,4.7,4.6,4.7,4.5,4.5,4.8,4.9,4.7,4.8,4.5,4.5,4.5,4.7,4.6,4.5,4.9,4.9,4.8,4.9,4.8],"x0":4.5,"x1":5},{"sample":[5,5.1,5.1,5.1,5.3,5,5.1,5.3,5,5.1,5.4,5.1,5.1,5.2,5,5.2,5.4,5.1],"x0":5,"x1":5.5},{"sample":[5.9,5.6,5.8,5.8,5.5,5.5,5.7,5.7,5.6,5.8,5.6,5.6,5.6,5.5,5.6,5.9,5.7],"x0":5.5,"x1":6},{"sample":[6,6.3,6.1,6,6.1,6.4,6.1],"x0":6,"x1":6.5},{"sample":[6.6,6.7,6.9,6.7],"x0":6.5,"x1":7}],"data":[[0.75,0],[1.25,24],[1.75,26],[2.25,0],[2.75,0],[3.25,3],[3.75,8],[4.25,18],[4.75,25],[5.25,18],[5.75,17],[6.25,7],[6.75,4]]};
                var interval;
                var min = Infinity;
                var max = -Infinity;
                data = echarts.util.map(bins.data, function (item, index) {
                    var x0 = bins.bins[index].x0;
                    var x1 = bins.bins[index].x1;
                    interval = x1 - x0;
                    min = Math.min(min, x0);
                    max = Math.max(max, x1);
                    return [x0, x1, item[1]];
                });

                function renderItem(params, api) {
                    var yValue = api.value(2);
                    var start = api.coord([api.value(0), yValue]);
                    var size = api.size([api.value(1) - api.value(0), yValue]);
                    var style = api.style();

                    return {
                        type: 'rect',
                        shape: {
                            x: start[0] + 1,
                            y: start[1],
                            width: size[0] - 2,
                            height: size[1]
                        },
                        style: style
                    };
                }

                var option = {
                    tooltip: {
                    },
                    xAxis: {
                        interval: interval,
                        min: min,
                        max: max
                    },
                    yAxis: {
                    },
                    series: [{
                        type: 'custom',
                        renderItem: renderItem,
                        label: {
                            normal: {
                                show: true,
                                position: 'top'
                            }
                        },
                        encode: {
                            x: [0, 1],
                            y: 2,
                            tooltip: 2
                        },
                        data: data
                    }]
                };

                testHelper.createChart(echarts, 'histogram', option);
            });
        </script>












        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                // var data = [[10, 16, 3], [16, 18, 15], [18, 26, 12], [26, 32, 22], [32, 56, 7], [56, 62, 17]];
                var data = [[10, 16, 3, 'A'], [16, 18, 15, 'B'], [18, 26, 12, 'C'], [26, 32, 22, 'D'], [32, 56, 7, 'E'], [56, 62, 17, 'F']];
                var colorList = ['#4f81bd', '#c0504d', '#9bbb59', '#604a7b', '#948a54', '#e46c0b'];
                data = echarts.util.map(data, function (item, index) {
                    return {
                        value: item,
                        itemStyle: {
                            normal: {
                                color: colorList[index]
                            }
                        }
                    };
                });

                function renderItem(params, api) {
                    var yValue = api.value(2);
                    var start = api.coord([api.value(0), yValue]);
                    var size = api.size([api.value(1) - api.value(0), yValue]);
                    var style = api.style();

                    return {
                        type: 'rect',
                        shape: {
                            x: start[0],
                            y: start[1],
                            width: size[0],
                            height: size[1]
                        },
                        style: style
                    };
                }

                var option = {
                    tooltip: {
                    },
                    xAxis: {
                        scale: true
                    },
                    yAxis: {
                    },
                    series: [{
                        type: 'custom',
                        renderItem: renderItem,
                        label: {
                            normal: {
                                show: true,
                                position: 'top'
                            }
                        },
                        dimensions: ['from', 'to', 'profit'],
                        encode: {
                            x: [0, 1],
                            y: 2,
                            tooltip: [0, 1, 2]
                        },
                        data: data
                    }]
                };

                testHelper.createChart(echarts, 'profit', option);
            });
        </script>













        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                var categoryData = [];
                var errorData = [];
                var barData = [];
                var dataCount = 100;
                for (var i = 0; i < dataCount; i++) {
                    var val = Math.random() * 1000;
                    categoryData.push('category' + i);
                    errorData.push([
                        i,
                        echarts.number.round(Math.max(0, val - Math.random() * 100)),
                        echarts.number.round(val + Math.random() * 80)
                    ]);
                    barData.push(echarts.number.round(val, 2));
                }

                function renderItem(params, api) {
                    var xValue = api.value(0);
                    var highPoint = api.coord([xValue, api.value(1)]);
                    var lowPoint = api.coord([xValue, api.value(2)]);
                    var halfWidth = api.size([1, 0])[0] * 0.1;
                    var style = api.style({
                        stroke: api.visual('color'),
                        fill: null
                    });

                    return {
                        type: 'group',
                        children: [{
                            type: 'line',
                            shape: {
                                x1: highPoint[0] - halfWidth, y1: highPoint[1],
                                x2: highPoint[0] + halfWidth, y2: highPoint[1]
                            },
                            style: style
                        }, {
                            type: 'line',
                            shape: {
                                x1: highPoint[0], y1: highPoint[1],
                                x2: lowPoint[0], y2: lowPoint[1]
                            },
                            style: style
                        }, {
                            type: 'line',
                            shape: {
                                x1: lowPoint[0] - halfWidth, y1: lowPoint[1],
                                x2: lowPoint[0] + halfWidth, y2: lowPoint[1]
                            },
                            style: style
                        }]
                    };
                }

                var option = {
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        data: ['bar', 'error']
                    },
                    dataZoom: [{
                        type: 'slider',
                        start: 50,
                        end: 70
                    }, {
                        type: 'inside',
                        start: 50,
                        end: 70
                    }],
                    xAxis: {
                        data: categoryData
                    },
                    yAxis: {},
                    series: [{
                        type: 'bar',
                        name: 'bar',
                        data: barData,
                        itemStyle: {
                            normal: {
                                color: '#77bef7'
                            }
                        }
                    }, {
                        type: 'custom',
                        name: 'error',
                        itemStyle: {
                            normal: {
                                borderWidth: 1.5
                            }
                        },
                        renderItem: renderItem,
                        encode: {
                            x: 0,
                            y: [1, 2]
                        },
                        data: errorData,
                        z: 100
                    }]
                };

                testHelper.createChart(echarts, 'errorChart-cartesian-bar', option);
            });
        </script>











        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/chart/scatter',
                // 'echarts/component/legend',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {
                // Prime Costs and Prices for ACME Fashion\nCollection "Spring-Summer, 2016"
                // Data from https://playground.anychart.com/gallery/7.12.0/Error_Charts/Marker_Chart
                var dimensions = [
                    'name', 'Price', 'Prime cost', 'Prime cost min', 'Prime cost max', 'Price min', 'Price max'
                ];
                var data = [
                    ['Blouse "Blue Viola"', 101.88, 99.75, 76.75, 116.75, 69.88, 119.88],
                    ['Dress "Daisy"', 155.8, 144.03, 126.03, 156.03, 129.8, 188.8],
                    ['Trousers "Cutesy Classic"', 203.25, 173.56, 151.56, 187.56, 183.25, 249.25],
                    ['Dress "Morning Dew"', 256, 120.5, 98.5, 136.5, 236, 279],
                    ['Turtleneck "Dark Chocolate"', 408.89, 294.75, 276.75, 316.75, 385.89, 427.89],
                    ['Jumper "Early Spring"', 427.36, 430.24, 407.24, 452.24, 399.36, 461.36],
                    ['Breeches "Summer Mood"', 356, 135.5, 123.5, 151.5, 333, 387],
                    ['Dress "Mauve Chamomile"', 406, 95.5, 73.5, 111.5, 366, 429],
                    ['Dress "Flying Tits"', 527.36, 503.24, 488.24, 525.24, 485.36, 551.36],
                    ['Dress "Singing Nightingales"', 587.36, 543.24, 518.24, 555.24, 559.36, 624.36],
                    ['Sundress "Cloudy weather"', 603.36, 407.24, 392.24, 419.24, 581.36, 627.36],
                    ['Sundress "East motives"', 633.36, 477.24, 445.24, 487.24, 594.36, 652.36],
                    ['Sweater "Cold morning"', 517.36, 437.24, 416.24, 454.24, 488.36, 565.36],
                    ['Trousers "Lavender Fields"', 443.36, 387.24, 370.24, 413.24, 412.36, 484.36],
                    ['Jumper "Coffee with Milk"', 543.36, 307.24, 288.24, 317.24, 509.36, 574.36],
                    ['Blouse "Blooming Cactus"', 790.36, 277.24, 254.24, 295.24, 764.36, 818.36],
                    ['Sweater "Fluffy Comfort"', 790.34, 678.34, 660.34, 690.34, 762.34, 824.34]
                ];

                function renderItem(params, api) {
                    var children = [];
                    var coordDims = ['x', 'y'];

                    for (var baseDimIdx = 0; baseDimIdx < 2; baseDimIdx++) {
                        var otherDimIdx = 1 - baseDimIdx;
                        var encode = params.encode;
                        var baseValue = api.value(encode[coordDims[baseDimIdx]][0]);
                        var param = [];
                        param[baseDimIdx] = baseValue;
                        param[otherDimIdx] = api.value(encode[coordDims[otherDimIdx]][1]);
                        var highPoint = api.coord(param);
                        param[otherDimIdx] = api.value(encode[coordDims[otherDimIdx]][2]);
                        var lowPoint = api.coord(param);
                        var halfWidth = 5;

                        var style = api.style({
                            stroke: api.visual('color'),
                            fill: null
                        });

                        children.push({
                            type: 'line',
                            shape: makeShape(
                                baseDimIdx,
                                highPoint[baseDimIdx] - halfWidth, highPoint[otherDimIdx],
                                highPoint[baseDimIdx] + halfWidth, highPoint[otherDimIdx]
                            ),
                            style: style
                        }, {
                            type: 'line',
                            shape: makeShape(
                                baseDimIdx,
                                highPoint[baseDimIdx], highPoint[otherDimIdx],
                                lowPoint[baseDimIdx], lowPoint[otherDimIdx]
                            ),
                            style: style
                        }, {
                            type: 'line',
                            shape: makeShape(
                                baseDimIdx,
                                lowPoint[baseDimIdx] - halfWidth, lowPoint[otherDimIdx],
                                lowPoint[baseDimIdx] + halfWidth, lowPoint[otherDimIdx]
                            ),
                            style: style
                        });
                    }

                    function makeShape(baseDimIdx, base1, value1, base2, value2) {
                        var shape = {};
                        shape[coordDims[baseDimIdx] + '1'] = base1;
                        shape[coordDims[1 - baseDimIdx] + '1'] = value1;
                        shape[coordDims[baseDimIdx] + '2'] = base2;
                        shape[coordDims[1 - baseDimIdx] + '2'] = value2;
                        return shape;
                    }

                    return {
                        type: 'group',
                        children: children
                    };
                }

                var option = {
                    tooltip: {
                    },
                    legend: {
                        data: ['bar', 'error']
                    },
                    dataZoom: [{
                        type: 'slider'
                    }, {
                        type: 'inside'
                    }],
                    xAxis: {},
                    yAxis: {},
                    series: [{
                        type: 'scatter',
                        name: 'error',
                        data: data,
                        dimensions: dimensions,
                        encode: {
                            x: 2,
                            y: 1,
                            tooltip: [2, 1, 3, 4, 5, 6],
                            itemName: 0
                        },
                        itemStyle: {
                            normal: {
                                color: '#77bef7'
                            }
                        }
                    }, {
                        type: 'custom',
                        name: 'error',
                        renderItem: renderItem,
                        dimensions: dimensions,
                        encode: {
                            x: [2, 3, 4],
                            y: [1, 5, 6],
                            tooltip: [2, 1, 3, 4, 5, 6],
                            itemName: 0
                        },
                        data: data,
                        z: 100
                    }]
                };

                testHelper.createChart(echarts, 'errorChart-cartesian-scatter', option);
            });
        </script>









        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                var yearCount = 7;
                var categoryCount = 30;

                var xAxisData = [];
                var customData = [];
                var legendData = [];
                var dataList = [];

                legendData.push('trend');
                var encodeY = [];
                for (var i = 0; i < yearCount; i++) {
                    legendData.push((2010 + i) + '');
                    dataList.push([]);
                    encodeY.push(1 + i);
                };

                for (var i = 0; i < categoryCount; i++) {
                    var val = Math.random() * 1000;
                    xAxisData.push('category' + i);
                    var customVal = [i];
                    customData.push(customVal);

                    var data = dataList[0];
                    for (var j = 0; j < dataList.length; j++) {
                        var value = j === 0
                            ? echarts.number.round(val, 2)
                            : echarts.number.round(Math.max(0, dataList[j - 1][i] + (Math.random() - 0.5) * 200), 2);
                        dataList[j].push(value);
                        customVal.push(value);
                    }
                }

                function renderItem(params, api) {
                    var xValue = api.value(0);
                    var currentSeriesIndices = api.currentSeriesIndices();
                    var barLayout = api.barLayout({
                        count: currentSeriesIndices.length - 1
                    });

                    var points = [];
                    for (var i = 0; i < currentSeriesIndices.length; i++) {
                        var seriesIndex = currentSeriesIndices[i];
                        if (seriesIndex !== params.seriesIndex) {
                            var point = api.coord([xValue, api.value(seriesIndex)]);
                            point[0] += barLayout[i - 1].offsetCenter;
                            point[1] -= 20;
                            points.push(point);
                        }
                    }
                    var style = api.style({
                        stroke: api.visual('color'),
                        fill: null
                    });

                    return {
                        type: 'polyline',
                        shape: {
                            points: points
                        },
                        style: style
                    };
                }

                var option = {
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        data: legendData
                    },
                    dataZoom: [{
                        type: 'slider',
                        start: 50,
                        end: 70
                    }, {
                        type: 'inside',
                        start: 50,
                        end: 70
                    }],
                    xAxis: {
                        data: xAxisData
                    },
                    yAxis: {},
                    series: [{
                        type: 'custom',
                        name: 'trend',
                        renderItem: renderItem,
                        itemStyle: {
                            normal: {
                                borderWidth: 2
                            }
                        },
                        encode: {
                            x: 0,
                            y: encodeY
                        },
                        data: customData,
                        z: 100
                    }].concat(echarts.util.map(dataList, function (data, index) {
                        return {
                            type: 'bar',
                            animation: false,
                            name: legendData[index + 1],
                            itemStyle: {
                                normal: {
                                    opacity: 0.5
                                }
                            },
                            data: data
                        };
                    }))
                };

                testHelper.createChart(echarts, 'errorChart-cartesian-bar-multi', option);
            });
        </script>









        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                var data = [];
                var dataCount = 7;
                for (var i = 0; i < dataCount; i++) {
                    var val = Math.random() * 1000;
                    data.push([
                        echarts.number.round(Math.random() * 100),
                        echarts.number.round(Math.random() * 400)
                    ]);
                }

                function renderItem(params, api) {
                    if (params.context.rendered) {
                        return;
                    }
                    params.context.rendered = true;

                    var points = [];
                    for (var i = 0; i < data.length; i++) {
                        points.push(api.coord(data[i]));
                    }
                    var color = api.visual('color');

                    return {
                        type: 'polygon',
                        shape: {
                            points: echarts.graphic.clipPointsByRect(points, {
                                x: params.coordSys.x,
                                y: params.coordSys.y,
                                width: params.coordSys.width,
                                height: params.coordSys.height
                            })
                        },
                        style: api.style({
                            fill: color,
                            stroke: echarts.color.lift(color)
                        })
                    };
                }

                var option = {
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        data: ['bar', 'error']
                    },
                    dataZoom: [{
                        type: 'slider',
                        filterMode: 'none'
                    }, {
                        type: 'inside',
                        filterMode: 'none'
                    }],
                    xAxis: {},
                    yAxis: {},
                    series: [{
                        type: 'custom',
                        renderItem: renderItem,
                        data: data
                    }]
                };

                testHelper.createChart(echarts, 'cartesian-polygon', option);
            });
        </script>










        <script>
            require([
                'echarts'
                // 'echarts/chart/heatmap',
                // 'echarts/chart/custom',
                // 'echarts/component/legend',
                // 'echarts/component/calendar',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                var layouts = [
                    [[0, 0]],
                    [[-0.25, 0], [0.25, 0]],
                    [[0, -0.2], [-0.2, 0.2], [0.2, 0.2]],
                    [[-0.25, -0.25], [-0.25, 0.25], [0.25, -0.25], [0.25, 0.25]]
                ];
                var pathes = [
                    'M936.857805 523.431322c0 0-42.065715-68.89513-88.786739-68.89513-46.68416 0-95.732122 71.223091-95.732122 71.223091s-44.28544-72.503296-93.440922-71.152538c-35.565466 0.977306-62.89705 30.882406-79.124275 64.06615L579.773747 790.800797c-3.253248 37.391565-5.677568 50.904371-12.002816 69.63497-6.651802 19.698688-19.544883 35.227341-31.650099 45.909606-14.30231 12.621414-29.59831 22.066586-45.854208 27.424563-16.28969 5.362074-30.098739 6.496973-51.536794 6.496973-19.498906 0-36.95104-2.963456-52.395418-8.850534-15.410586-5.887078-28.420403-14.313984-39.034573-25.246003-10.613146-10.930995-18.757939-24.08151-24.435507-39.525171-5.676544-15.443763-8.532685-40.195482-8.532685-59.270963l0-26.232454 74.435273 0c0 24.644301-0.17705 64.452915 8.81408 77.006848 9.02697 12.515021 22.756147 18.092032 41.148826 18.791014 16.728678 0.636518 30.032179-8.061645 30.032179-8.061645s11.922022-10.5472 14.992077-19.756954c2.674995-8.025805 3.565363-22.180147 3.565363-22.180147s2.080461-21.789286 2.080461-34.234675L489.399906 514.299369c-16.678502-18.827776-43.801395-61.938688-82.756096-60.927693-54.699008 1.419366-100.422144 70.059622-100.422144 70.059622s-56.065126-70.059622-93.440922-70.059622c-37.376717 0-91.077939 70.059622-91.077939 70.059622S105.343488 156.737741 476.742042 119.363584l53.70327-74.714624 51.373056 74.714624C964.889395 142.740992 936.857805 523.431322 936.857805 523.431322z',
                    'M533.504 268.288q33.792-41.984 71.68-75.776 32.768-27.648 74.24-50.176t86.528-19.456q63.488 5.12 105.984 30.208t67.584 63.488 34.304 87.04 6.144 99.84-17.92 97.792-36.864 87.04-48.64 74.752-53.248 61.952q-40.96 41.984-85.504 78.336t-84.992 62.464-73.728 41.472-51.712 15.36q-20.48 1.024-52.224-14.336t-69.632-41.472-79.872-61.952-82.944-75.776q-26.624-25.6-57.344-59.392t-57.856-74.24-46.592-87.552-21.504-100.352 11.264-99.84 39.936-83.456 65.536-61.952 88.064-35.328q24.576-5.12 49.152-1.536t48.128 12.288 45.056 22.016 40.96 27.648q45.056 33.792 86.016 80.896z',
                    'M741.06368 733.310464c8.075264-29.262438 20.615373-40.632422 14.64105-162.810061C966.089728 361.789952 967.93897 72.37847 967.855002 54.693683c0.279347-0.279347 0.418509-0.419533 0.418509-0.419533s-0.17705-0.00512-0.428749-0.00512c0-0.251699 0-0.428749 0-0.428749s-0.139162 0.14633-0.418509 0.425677c-17.695744-0.083866-307.10784 1.760051-515.833958 212.142592-122.181632-5.984256-133.55305 6.563533-162.815693 14.644531C235.35063 295.798886 103.552614 436.975309 90.630758 486.076621c-12.921856 49.105408 39.634227 56.859034 58.579558 58.581197 18.953421 1.724314 121.471386-9.475789 130.09111 4.309094 0 0 16.367411 11.200102 17.226035 41.346662 0.850432 29.796659 15.173222 71.354163 37.123994 97.267302-0.028672 0.027648-0.05632 0.054272-0.083866 0.074752 0.158618 0.13097 0.316211 0.261939 0.474829 0.390861 0.129946 0.149402 0.261939 0.319283 0.393011 0.468685 0.019456-0.019456 0.04608-0.049152 0.075776-0.075674 25.918362 21.961216 67.477504 36.272128 97.269248 37.122458 30.149837 0.859546 41.354547 17.234534 41.354547 17.234534 13.779354 8.608051 2.583962 111.122842 4.302131 130.075546 1.727386 18.95168 9.477222 71.498445 58.579558 58.576077C585.12896 918.526771 726.311117 786.734182 741.06368 733.310464zM595.893555 426.206003c-39.961702-39.965184-39.961702-104.75991 0-144.720077 39.970918-39.96928 104.768307-39.96928 144.730112 0 39.970918 39.960064 39.970918 104.75479 0 144.720077C700.661862 466.171187 635.864474 466.171187 595.893555 426.206003zM358.53312 769.516032c-31.923302-4.573184-54.890394-18.410291-71.41847-35.402342-16.984474-16.526438-30.830387-39.495475-35.405824-71.420621-4.649062-28.082586-20.856832-41.167565-38.76649-38.763827-17.906586 2.40681-77.046886 66.714419-80.857805 89.475891-3.80887 22.752154 29.271859 12.081152 46.424166 27.654861 17.151283 15.590093-2.139853 61.93664-14.733107 86.845952-6.441984 12.735078-10.289766 26.42176-4.22953 33.76087 7.346586 6.070272 21.03593 2.222592 33.769472-4.220109 24.912384-12.585677 71.258829-31.872922 86.842368-14.731469 15.583539 17.160806 4.911002 50.229965 27.674419 46.419251 22.754099-3.807744 87.065395-62.946611 89.466163-80.85248C399.70857 790.374093 386.627072 774.166938 358.53312 769.516032z',
                    'M848.794624 939.156685 571.780416 939.156685 571.780416 653.17123l341.897539 0 0 221.100654C913.677926 909.960704 884.482867 939.156685 848.794624 939.156685zM571.780403 318.743552c-11.861606-3.210138-31.443354-8.36864-39.829709-16.176435-0.596582-0.561766-1.016218-1.246413-1.613824-1.841971-0.560845 0.596582-1.016218 1.280205-1.613824 1.841971-8.386355 7.807795-15.96631 12.965274-27.827917 16.176435l0 263.544325L141.030675 582.287877 141.030675 355.202884c0-35.687834 29.195059-64.882688 64.883302-64.882688l150.649125 0c-16.984474-9.525965-32.846438-20.56233-46.111027-32.932045-60.250624-56.144691-71.129907-137.062605-24.283034-180.767027 19.615539-18.264986 46.252237-27.124736 75.026739-27.124736 39.933133 0 83.972915 17.070797 118.995968 49.706086 20.353331 18.983322 37.722624 43.405619 50.145075 69.056819 12.457267-25.6512 29.791744-50.074419 50.180915-69.056819 35.022029-32.63529 79.062835-49.706086 118.994944-49.706086 28.74071 0 55.410176 8.860774 75.025715 27.124736 46.882611 43.704422 35.96759 124.622336-24.283034 180.767027-13.264589 12.368691-29.127578 23.40608-46.111027 32.932045l144.649234 0c35.688243 0 64.882278 29.195981 64.882278 64.882688l0 227.084948L571.780416 582.287833 571.780416 318.743508zM435.064218 147.625267c-21.476966-19.965747-49.094144-31.913882-73.868288-31.913882-7.404954 0-21.125018 1.211597-29.863322 9.386803-2.000691 1.824563-8.070144 7.439462-8.070144 21.369754 0 15.650406 8.492749 40.24873 32.319386 62.477926 29.124506 27.12576 77.202432 47.601152 111.76704 47.601152 12.176794 0 16.492237-2.666701 16.527053-2.702541C489.524736 242.54505 475.664486 185.453773 435.064218 147.625267zM577.78135 254.790963c0 0 0.034816-0.034816 0.069632-0.034816 0.807424 0 5.50871 1.790771 15.509914 1.790771 34.564608 0 82.64151-20.47529 111.76704-47.601152 23.826637-22.229299 32.283546-46.810112 32.283546-62.442189 0-13.930291-6.033613-19.562496-8.035328-21.404467-8.77312-8.17623-22.457344-9.386803-29.864346-9.386803-24.808038 0-52.390298 11.948134-73.867264 31.913882C585.325466 185.208218 571.358822 241.73865 577.78135 254.790963zM500.89513 939.156685 205.914017 939.156685c-35.688243 0-64.883302-29.195981-64.883302-64.883712L141.030714 653.17123l359.864462 0L500.895177 939.15666z'
                ];
                var colors = [
                    '#c4332b', '#16B644', '#6862FD', '#FDC763'
                ];

                function getVirtulData(year) {
                    year = year || '2017';
                    var date = +echarts.number.parseDate(year + '-01-01');
                    var end = +echarts.number.parseDate((+year + 1) + '-01-01');
                    var dayTime = 3600 * 24 * 1000;
                    var data = [];
                    for (var time = date; time < end; time += dayTime) {
                        var items = [];
                        var eventCount = Math.round(Math.random() * pathes.length);
                        for (var i = 0; i < eventCount; i++) {
                            items.push(Math.round(Math.random() * (pathes.length - 1)));
                        }
                        data.push([
                            echarts.format.formatTime('yyyy-MM-dd', time),
                            items.join('|')
                        ]);
                    }
                    return data;
                }

                function renderItem(params, api) {
                    var cellPoint = api.coord(api.value(0));
                    var cellWidth = params.coordSys.cellWidth;
                    var cellHeight = params.coordSys.cellHeight;

                    var value = api.value(1);
                    var events = value && value.split('|');

                    if (isNaN(cellPoint[0]) || isNaN(cellPoint[1])) {
                        return;
                    }

                    if (!events) {
                        return {
                            type: 'image',
                            style: {
                                image: './data/hill-Qomolangma.png',
                                x: cellPoint[0] - cellWidth / 2 + 10,
                                y: cellPoint[1] - cellHeight / 2 + 10,
                                width: cellWidth - 20,
                                height: cellHeight - 20,
                                opacity: 0.7
                            }
                        };
                    }

                    var group = {
                        type: 'group',
                        children: echarts.util.map(layouts[events.length - 1], function (itemLayout, index) {
                            return {
                                type: 'path',
                                shape: {
                                    pathData: pathes[events[index]],
                                    x: -8,
                                    y: -8,
                                    width: 16,
                                    height: 16
                                },
                                position: [
                                    cellPoint[0] + echarts.number.linearMap(itemLayout[0], [-0.5, 0.5], [-cellWidth / 2, cellWidth / 2]),
                                    cellPoint[1] + echarts.number.linearMap(itemLayout[1], [-0.5, 0.5], [-cellHeight / 2 + 20, cellHeight / 2])
                                ],
                                style: api.style({
                                    fill: colors[events[index]]
                                })
                            };
                        }) || []
                    };

                    group.children.push({
                        type: 'text',
                        style: {
                            x: cellPoint[0],
                            y: cellPoint[1] - cellHeight / 2 + 15,
                            text: echarts.format.formatTime('dd', api.value(0)),
                            fill: '#777',
                            textFont: api.font({fontSize: 14})
                        }
                    });

                    return group;
                }

                var option = {
                    tooltip: {
                    },
                    calendar: [{
                        left: 'center',
                        top: 'middle',
                        cellSize: [70, 70],
                        yearLabel: {show: false},
                        orient: 'vertical',
                        dayLabel: {
                            firstDay: 1,
                            nameMap: 'cn'
                        },
                        monthLabel: {
                            show: false
                        },
                        range: '2017-03'
                    }],
                    series: [{
                        type: 'custom',
                        coordinateSystem: 'calendar',
                        renderItem: renderItem,
                        dimensions: [null, {type: 'ordinal'}],
                        data: getVirtulData(2017)
                    }]
                };

                testHelper.createChart(echarts, 'calendar', option);
            });
        </script>













        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                var textData = [];
                var imageData = [];
                var pathData = [];
                var dataCount = 30;
                var words = ['echarts', 'good morning', '易查词', '自定义文字'];

                for (var i = 0; i < dataCount; i++) {
                    var val = Math.random() * 1000;
                    textData.push([Math.random(), Math.random(), words[Math.round(Math.random() * (words.length - 1))]]);
                    var imagePoint = [Math.random(), Math.random()];
                    imageData.push([
                        imagePoint[0], imagePoint[1],
                        imagePoint[0] + Math.random() / 20, imagePoint[1] + Math.random() / 20
                    ]);
                    var pathPoint = [Math.random(), Math.random()];
                    pathData.push([pathPoint[0], pathPoint[1]]);
                }

                function renderItemText(params, api) {
                    var point = api.coord([api.value(0), api.value(1)]);

                    return {
                        type: 'text',
                        style: {
                            text: api.value(2),
                            x: point[0],
                            y: point[1]
                        }
                    };
                }

                function renderItemImage(params, api) {
                    var leftTop = api.coord([api.value(0), api.value(1)]);
                    var rightBottom = api.coord([api.value(2), api.value(3)]);

                    return {
                        type: 'image',
                        style: {
                            image: './data/hill-Qomolangma.png',
                            x: leftTop[0],
                            y: leftTop[1],
                            width: rightBottom[0] - leftTop[0],
                            height: rightBottom[1] - leftTop[1]
                        }
                    };
                }

                function renderItemPath(params, api) {
                    return {
                        type: 'path',
                        shape: {
                            pathData: 'M936.857805 523.431322c0 0-42.065715-68.89513-88.786739-68.89513-46.68416 0-95.732122 71.223091-95.732122 71.223091s-44.28544-72.503296-93.440922-71.152538c-35.565466 0.977306-62.89705 30.882406-79.124275 64.06615L579.773747 790.800797c-3.253248 37.391565-5.677568 50.904371-12.002816 69.63497-6.651802 19.698688-19.544883 35.227341-31.650099 45.909606-14.30231 12.621414-29.59831 22.066586-45.854208 27.424563-16.28969 5.362074-30.098739 6.496973-51.536794 6.496973-19.498906 0-36.95104-2.963456-52.395418-8.850534-15.410586-5.887078-28.420403-14.313984-39.034573-25.246003-10.613146-10.930995-18.757939-24.08151-24.435507-39.525171-5.676544-15.443763-8.532685-40.195482-8.532685-59.270963l0-26.232454 74.435273 0c0 24.644301-0.17705 64.452915 8.81408 77.006848 9.02697 12.515021 22.756147 18.092032 41.148826 18.791014 16.728678 0.636518 30.032179-8.061645 30.032179-8.061645s11.922022-10.5472 14.992077-19.756954c2.674995-8.025805 3.565363-22.180147 3.565363-22.180147s2.080461-21.789286 2.080461-34.234675L489.399906 514.299369c-16.678502-18.827776-43.801395-61.938688-82.756096-60.927693-54.699008 1.419366-100.422144 70.059622-100.422144 70.059622s-56.065126-70.059622-93.440922-70.059622c-37.376717 0-91.077939 70.059622-91.077939 70.059622S105.343488 156.737741 476.742042 119.363584l53.70327-74.714624 51.373056 74.714624C964.889395 142.740992 936.857805 523.431322 936.857805 523.431322z',
                            x: -10,
                            y: -10,
                            width: 20,
                            height: 20
                        },
                        position: api.coord([api.value(0), api.value(1)]),
                        style: api.style()
                    };
                }

                var option = {
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        data: ['text', 'image', 'path']
                    },
                    dataZoom: [{
                        type: 'slider',
                        filterMode: 'weakFilter',
                        start: 50,
                        end: 70
                    }, {
                        type: 'inside',
                        filterMode: 'weakFilter',
                        start: 50,
                        end: 70
                    }],
                    xAxis: {},
                    yAxis: {},
                    series: [{
                        type: 'custom',
                        name: 'text',
                        data: textData,
                        dimensions: [null, null, {type: 'ordinal'}],
                        renderItem: renderItemText
                    }, {
                        type: 'custom',
                        name: 'image',
                        data: imageData,
                        encode: {
                            x: [0, 2],
                            y: [1, 3]
                        },
                        renderItem: renderItemImage
                    }, {
                        type: 'custom',
                        name: 'path',
                        data: pathData,
                        renderItem: renderItemPath
                    }]
                };

                testHelper.createChart(echarts, 'text-image-update', option);
            });
        </script>








        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/component/polar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                function renderItem(params, api) {
                    var values = [api.value(0), api.value(1)];
                    var coord = api.coord(values);
                    var size = api.size([1, 1], values);
                    return {
                        type: 'sector',
                        shape: {
                            cx: params.coordSys.cx,
                            cy: params.coordSys.cy,
                            r0: coord[2] - size[0] / 2,
                            r: coord[2] + size[0] / 2,
                            startAngle: coord[3] - size[1] / 2,
                            endAngle: coord[3] + size[1] / 2
                        },
                        style: api.style({
                            fill: api.visual('color')
                        })
                    };
                }

                var hours = ['12a', '1a', '2a', '3a', '4a', '5a', '6a',
                        '7a', '8a', '9a','10a','11a',
                        '12p', '1p', '2p', '3p', '4p', '5p',
                        '6p', '7p', '8p', '9p', '10p', '11p'];
                var days = ['Saturday', 'Friday', 'Thursday',
                        'Wednesday', 'Tuesday', 'Monday', 'Sunday'];

                var data = [[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],[0,11,2],[0,12,4],[0,13,1],[0,14,1],[0,15,3],[0,16,4],[0,17,6],[0,18,4],[0,19,4],[0,20,3],[0,21,3],[0,22,2],[0,23,5],[1,0,7],[1,1,0],[1,2,0],[1,3,0],[1,4,0],[1,5,0],[1,6,0],[1,7,0],[1,8,0],[1,9,0],[1,10,5],[1,11,2],[1,12,2],[1,13,6],[1,14,9],[1,15,11],[1,16,6],[1,17,7],[1,18,8],[1,19,12],[1,20,5],[1,21,5],[1,22,7],[1,23,2],[2,0,1],[2,1,1],[2,2,0],[2,3,0],[2,4,0],[2,5,0],[2,6,0],[2,7,0],[2,8,0],[2,9,0],[2,10,3],[2,11,2],[2,12,1],[2,13,9],[2,14,8],[2,15,10],[2,16,6],[2,17,5],[2,18,5],[2,19,5],[2,20,7],[2,21,4],[2,22,2],[2,23,4],[3,0,7],[3,1,3],[3,2,0],[3,3,0],[3,4,0],[3,5,0],[3,6,0],[3,7,0],[3,8,1],[3,9,0],[3,10,5],[3,11,4],[3,12,7],[3,13,14],[3,14,13],[3,15,12],[3,16,9],[3,17,5],[3,18,5],[3,19,10],[3,20,6],[3,21,4],[3,22,4],[3,23,1],[4,0,1],[4,1,3],[4,2,0],[4,3,0],[4,4,0],[4,5,1],[4,6,0],[4,7,0],[4,8,0],[4,9,2],[4,10,4],[4,11,4],[4,12,2],[4,13,4],[4,14,4],[4,15,14],[4,16,12],[4,17,1],[4,18,8],[4,19,5],[4,20,3],[4,21,7],[4,22,3],[4,23,0],[5,0,2],[5,1,1],[5,2,0],[5,3,3],[5,4,0],[5,5,0],[5,6,0],[5,7,0],[5,8,2],[5,9,0],[5,10,4],[5,11,1],[5,12,5],[5,13,10],[5,14,5],[5,15,7],[5,16,11],[5,17,6],[5,18,0],[5,19,5],[5,20,3],[5,21,4],[5,22,2],[5,23,0],[6,0,1],[6,1,0],[6,2,0],[6,3,0],[6,4,0],[6,5,0],[6,6,0],[6,7,0],[6,8,0],[6,9,0],[6,10,1],[6,11,0],[6,12,2],[6,13,1],[6,14,3],[6,15,4],[6,16,0],[6,17,0],[6,18,0],[6,19,0],[6,20,1],[6,21,2],[6,22,2],[6,23,6]];
                var maxValue = echarts.util.reduce(data, function (max, item) {
                    return Math.max(max, item[2]);
                }, -Infinity);

                option = {
                    legend: {
                        data: ['Punch Card']
                    },
                    polar: {},
                    tooltip: {
                    },
                    animation: false,
                    dataZoom: {
                        type: 'slider',
                        radiusAxisIndex: 0
                    },
                    visualMap: {
                        type: 'continuous',
                        min: 0,
                        max: maxValue,
                        dimension: 2,
                        calculable: true
                    },
                    angleAxis: {
                        type: 'category',
                        data: hours,
                        boundaryGap: false,
                        splitLine: {
                            show: true,
                            lineStyle: {
                                color: '#ddd',
                                type: 'dashed'
                            }
                        },
                        axisLine: {
                            show: false
                        }
                    },
                    radiusAxis: {
                        type: 'category',
                        data: days,
                        axisLabel: {
                            rotate: 45
                        },
                        z: 100
                    },
                    series: [{
                        name: 'Punch Card',
                        type: 'custom',
                        coordinateSystem: 'polar',
                        itemStyle: {
                            normal: {
                                color: '#d14a61'
                            }
                        },
                        renderItem: renderItem,
                        data: data
                    }]
                };

                testHelper.createChart(echarts, 'polar-block', option);
            });
        </script>








        <script>
            require([
                'echarts'
                // 'echarts/chart/custom',
                // 'echarts/component/polar',
                // 'echarts/component/legend',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {

                var data = [
                    {name:'广州', value: 50},
                    {name:'深圳', value: 72},
                    {name:'珠海', value: 30},
                    {name:'佛山', value: 38},
                    {name:'杭州', value: 42},
                    {name:'舟山', value: 32},
                    {name:'宁波', value: 52}
                ];

                var option = {
                    tooltip : {
                        trigger: 'item'
                    },
                    legend: {
                        data:['广州','深圳','珠海','佛山','杭州','舟山','宁波'],
                        top: 0,
                        left: 'center'
                    },
                    xAxis : [
                        {
                            type : 'category',
                            data : [0],
                            axisTick: {show: false},
                            axisLabel: {show: false}
                        },
                    ],
                    yAxis : [
                        {
                            type : 'value'
                        }
                    ],
                    series : echarts.util.map(data, function (item) {
                        return {
                            name: item.name,
                            type: 'bar',
                            label: {
                                normal: {
                                    show: true,
                                    position: 'bottom',
                                    formatter: function (param) {
                                        return param.seriesName;
                                    }
                                }
                            },
                            data: [item.value]
                        }
                    }).concat([{
                        type: 'custom',
                        renderItem: renderProvinceName,
                        data: [0]
                    }])
                };

                function renderProvinceName(param, api) {
                    var currentSeriesIndices = api.currentSeriesIndices();
                    currentSeriesIndices.pop(); // remove custom series;

                    var barLayout = api.barLayout({
                        count: currentSeriesIndices.length
                    });

                    var nameTexts = echarts.util.map(currentSeriesIndices, function (serIdx, index) {
                        var point = api.coord([0, 0]);
                        point[0] += barLayout[index].offsetCenter;
                        point[1] = api.getHeight() - 20;

                        return {
                            position: point,
                            name: serIdx,
                            type: 'circle',
                            shape: {
                                cx: 0, cy: 0, r: 10
                            },
                            style: {
                                text: serIdx,
                                fill: '#333',
                                textFill: '#eee',
                                stroke: null
                            }
                        };
                    });

                    return {
                        type: 'group',
                        $mergeChildren: 'byName',
                        children: nameTexts
                    };
                }

                testHelper.createChart(echarts, 'diff-children-by-name', option);
            });
        </script>





    </body>
</html>