<!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">
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/facePrint.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: #146402;
                text-align: center;
                font-weight: bold;
                color: #eee;
                font-size: 14px;
            }
            body {
                position: absolute;
                left: 0;
                top: 0;
                bottom: 0;
                right: 0;
            }
            .chart {
                margin: 10px;
                /* background: #333; */
                height: 300px;
            }
        </style>

        <div style="padding: 100px;">

        <h2>'-' exists in data. tooltip shoule be displayed normally.</h2>
        <div class="chart" id="main0"></div>
        </div>




        <script>

            var echarts;
            var chart;
            var myChart;
            var groupCategories = [];
            var groupColors = [];

            require([
                'echarts'
            ], function (ec) {
                echarts = ec;
                chart = myChart = echarts.init(document.getElementById('main0'));

                option = {
                    tooltip : {
                        trigger: 'item',
                        showDelay : 0
                    },
                    xAxis : [
                        {
                            type : 'value',
                            scale:true,
                            min: 0,
                            max: 1000
                        }
                    ],
                    yAxis : [
                        {
                            type : 'value',
                            min: 0,
                            max: 1000,
                            scale:true
                        }
                    ],
                    series : [
                        {
                            name:'sin',
                            type:'scatter',
                            large: true,
                            largeThreshold: 1,
                            symbolSize: 10,
                            data: [[200, 200], ['-', 300], [400, 400]]
                        }
                    ]
                };

                chart.setOption(option);
            });

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