
<!--
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/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/markPoint'
            ], function (echarts) {

                var chart = echarts.init(document.getElementById('main'), null, {

                });

                var xAxisData = [];
                var data1 = [];
                var data2 = [];

                for (var i = 0; i < 10; i++) {
                    xAxisData.push('类目' + i);
                    data1.push(+Math.random().toFixed(2));
                    data2.push(+Math.random().toFixed(2));
                }

                if (console && console.log) {
                    console.log(data1);
                    console.log(data2);
                }

                chart.setOption({
                    legend: {
                        data: ['line-stack', 'line2-stack', 'line3']
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    xAxis: {
                        // data: ['类目1', '类目2', '类目3', '类目4', '类目5',]
                        data: xAxisData,
                        boundaryGap: false,
                        // inverse: true,
                        splitArea: {
                            show: true
                        }
                    },
                    yAxis: {
                        splitLine: {
                            // show: false
                        }
                    },
                    series: [
                        {
                            name: 'line-stack',
                            type: 'line',
                            stack: 'all',
                            symbolSize: 6,
                            areaStyle: {normal: {}},
                            data: data1,

                            markPoint: {
                                data: [
                                    {
                                        name: '最大值',
                                        type: 'max',
                                        value: 1
                                    },
                                    {
                                        xAxis: '类目3',
                                        yAxis: 0.5,
                                        value: 2
                                    }
                                ]
                            }
                        },
                        {
                            name: 'line2-stack',
                            type: 'line',
                            stack: 'all',
                            symbolSize: 6,
                            areaStyle: {normal: {}},
                            data: data2,

                            markPoint: {
                                label: {
                                    normal: {
                                        formatter: function (param) {
                                            return param.name + ' ' + param.value;
                                        },
                                        textStyle: {
                                            color: '#000'
                                        },
                                        position: 'top'
                                    }
                                },
                                data: [
                                    {
                                        name: '最小值stack',
                                        type: 'min',
                                        value: 1
                                    },
                                    {
                                        name: '最大值stack',
                                        type: 'max',
                                        value: 1
                                    },
                                    {
                                        name: '平均值stack',
                                        type: 'average',
                                        value: 1,
                                        // 覆盖series配置的symbolRotate
                                        symbolRotate: 45
                                    }
                                ],
                                symbolRotate: function(value, params) {
                                    return ~~(Math.random() * 360);
                                }
                            }
                        },
                        {
                            name: 'line3',
                            type: 'line',
                            symbolSize: 6,
                            data: data2,

                            markPoint: {
                                label: {
                                    normal: {
                                        formatter: function (param) {
                                            return param.name + ' ' + (param.value || '');
                                        },
                                        textStyle: {
                                            color: '#000'
                                        },
                                        position: 'top'
                                    }
                                },
                                data: [
                                    {
                                        name: '任意屏幕位置',
                                        value: 111,
                                        extData: {a: 1, b:2},
                                        x: 50, y: 100
                                    },
                                    {
                                        name: '000000000',
                                        coord: ['类目2', 0.6],
                                        value: 1
                                    },
                                    {
                                        name: '最小值',
                                        type: 'min',
                                        value: 1
                                    },
                                    {
                                        name: '最大值x',
                                        type: 'max',
                                        value: 1
                                    },
                                    {
                                        name: '最大值y',
                                        type: 'max',
                                        valueIndex: 0,
                                        value: 1
                                    },
                                    {
                                        name: '平均值',
                                        type: 'average',
                                        value: 1
                                    },
                                    {
                                        name: 'Y轴固定',
                                        xAxis: 'max',
                                        y: 100
                                    }
                                ]
                            }
                        }
                    ]
                });

                chart.on('click', function (params) {
                    console.log(params, params.data);
                });

            })

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