
<!--
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>
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
            }
        </style>
        <div id="main"></div>
        <script>


            require([
                'echarts'
                // 'echarts/chart/scatter',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/visualMapContinuous'
            ], function (echarts) {

                var chart = echarts.init(document.getElementById('main'));

                var data1 = [];
                var data2 = [];
                var data3 = [];

                var symbolCount = 6;

                // for (var i = 0; i < 100; i++) {
                //     data1.push([
                //         Math.random() * 5, Math.random() * 4, Math.random() * 20,
                //         Math.round(Math.random() * (symbolCount - 1))
                //     ]);
                //     data2.push([
                //         Math.random() * 10, Math.random() * 5, Math.random() * 20,
                //         Math.round(Math.random() * (symbolCount - 1))
                //     ]);
                //     data3.push([
                //         Math.random() * 15, Math.random() * 10, Math.random() * 20,
                //         Math.round(Math.random() * (symbolCount - 1))
                //     ]);
                // }
                for (var i = 0; i < 5; i++) {
                    data1.push([
                        i * 5, i * 4, i * 20
                    ]);
                    // data2.push([
                    //     i * 10, Math.random() * 5, Math.random() * 20,
                    //     Math.round(Math.random() * (symbolCount - 1))
                    // ]);
                    // data3.push([
                    //     Math.random() * 15, Math.random() * 10, Math.random() * 20,
                    //     Math.round(Math.random() * (symbolCount - 1))
                    // ]);
                }

                chart.setOption({
                    legend: {
                        top: 50,
                        data: ['scatter', 'scatter2', 'scatter3']
                    },
                    grid: {
                        top: '26%',
                        bottom: '26%'
                    },
                    xAxis: {
                        type: 'value',
                        splitLine: {
                            show: false
                        }
                    },
                    yAxis: {
                        type: 'value',
                        splitLine: {
                            show: false
                        }
                    },
                    visualMap: [
                        {
                            min: 0,
                            max: 200,
                            show: true,
                            itemWidth: 30,
                            calculable: true,
                            inverse: true,
                            dimension: 'value',
                            top: 'center',
                            inRange: {
                                symbolSize: [10, 180]
                            }
                        }
                    ],
                    series: [
                        {
                            name: 'scatter',
                            type: 'scatter',
                            itemStyle: {
                                normal: {
                                    opacity: 0.8,
                                    shadowBlur: 10,
                                    shadowOffsetX: 0,
                                    shadowOffsetY: 0,
                                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                                }
                            },
                            data: data1
                        },
                        {
                            name: 'scatter2',
                            type: 'scatter',
                            itemStyle: {
                                normal: {
                                    opacity: 0.8,
                                    shadowBlur: 10,
                                    shadowOffsetX: 0,
                                    shadowOffsetY: 0,
                                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                                }
                            },
                            data: data2
                        },
                        {
                            name: 'scatter3',
                            type: 'scatter',
                            itemStyle: {
                                normal: {
                                    opacity: 0.8,
                                    shadowBlur: 10,
                                    shadowOffsetX: 0,
                                    shadowOffsetY: 0,
                                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                                }
                            },
                            data: data3
                        }
                    ]
                });
            })

        </script>
    </body>
</html>