<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/facePrint.js"></script>
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
            .chart {
                height: 500px;
            }
            h1 {
                font-size: 20px;
                text-align: center;
                background: #bbb;
                padding: 10px 0;
            }
        </style>

        <h1>visual on hue</h1>
        <div class="chart" id="mainH"></div>
        <h1>visual on color opacity</h1>
        <div class="chart" id="mainZ"></div>
        <h1>pieces | auto split | check: min &gt; dataMin; max &lt; dataMax; </h1>
        <div class="chart" id="mainX"></div>
        <h1>pieces | auto split | check: minOpen/maxOpen</h1>
        <div class="chart" id="mainX2"></div>
        <h1>pieces | check: auto-sort</h1>
        <div class="chart" id="main0"></div>
        <h1>continuous | check: area that greater than dataMax</h1>
        <div class="chart" id="main1"></div>
        <h1>continuous | log axis | inverse axis | gradient on xAxis</h1>
        <div class="chart" id="main2"></div>
        <h1>continuous | positive and negative | check: min &gt; dataMin; max &lt; dataMax; </h1>
        <div class="chart" id="main4"></div>
        <h1>category axis</h1>
        <div class="chart" id="mainX0"></div>








        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('mainH');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

                var data0 = [];

                var MAX_DIM1 = 100;

                var itemStyle = {
                    normal: {
                        opacity: 0.8,
                        shadowBlur: 10,
                        shadowOffsetX: 0,
                        shadowOffsetY: 0,
                        shadowColor: 'rgba(0, 0, 0, 0.3)'
                    }
                };

                var last = 60;
                var lastDelta = 20;
                for (var i = 0; i < MAX_DIM1; i++) {
                    lastDelta += (Math.random() - 0.5) * 15;
                    data0.push([
                        i,
                        last += lastDelta
                    ]);
                }

                chart.setOption({
                    grid: {
                        top: 100,
                        bottom: 100
                    },
                    xAxis: {
                        type: 'value',
                        splitLine: {
                            show: false
                        }
                    },
                    yAxis: {
                        type: 'value',
                        splitLine: {
                            show: false
                        }
                    },
                    visualMap: [
                        {
                            show: true,
                            left: 'center',
                            bottom: 20,
                            orient: 'horizontal',
                            itemWidth: 20,
                            itemHeight: 200,
                            min: 0,
                            max: MAX_DIM1,
                            calculable: true,
                            range: [5, 95],
                            dimension: 0,
                            inRange: {
                                colorHue: [0, 300],
                                colorLightness: 0.35,
                                colorSaturation: 1
                            },
                            outOfRange: {
                                color: '#eee'
                            }
                        }
                    ],
                    series: [
                        {
                            name: 'hue',
                            type: 'line',
                            barMaxWidth: 10,
                            itemStyle: itemStyle,
                            areaStyle: {normal: {}},
                            data: data0
                        }
                    ]
                });
            });

        </script>












        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('mainZ');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

                var xAxisData = [];
                var data1 = [];
                var data2 = [];
                var min = Infinity;
                var max = -Infinity;

                var base1 = Math.round(Math.random() * 30);
                var base2 = base1;
                for (var i = 0; i < 10; i++) {
                    xAxisData.push('类目' + i);
                    base1 += Math.round(Math.random() * 60);

                    if (i > 500 && i < 550) {
                        data1.push(180);
                    }
                    else if (i > 700 && i < 740) {
                        data1.push(-90);
                    }
                    else {
                        data1.push(base1);
                    }

                    base2 += Math.round(Math.random() * 30 - 5);
                    data2.push(base2);

                    min = Math.min(data1[data1.length - 1], data2[data2.length - 1], min);
                    max = Math.max(data1[data1.length - 1], data2[data2.length - 1], max);
                }

                chart.setOption({
                    color: ['#01003D', '#004202'],
                    legend: {
                        data: ['line1', 'line2']
                    },
                    visualMap: {
                        type: 'piecewise',
                        top: 'center',
                        inRange: {
                            opacity: [0.1, 1]
                        },
                        outOfRange: {
                            color: '#fff'
                        },
                        min: min,
                        max: max,
                        minOpen: true,
                        maxOpen: true
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    xAxis: {
                        data: xAxisData,
                        boundaryGap: false
                    },
                    yAxis: {},
                    series: [{
                        name: 'line1',
                        type: 'line',
                        stack: 'all',
                        symbol: 'none',
                        lineStyle: { normal: {width: 8}},
                        data: data1
                    }, {
                        name: 'line2',
                        type: 'line',
                        stack: 'all',
                        symbol: 'none',
                        lineStyle: { normal: {width: 8}},
                        data: data2
                    }]
                });
            });

        </script>











        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('mainX0');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

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

                var base = Math.round(Math.random() * 30);
                for (var i = 0; i < 10; i++) {
                    xAxisData.push('类目' + i);
                    base += Math.round(Math.random() * 10 - 5);

                    if (i > 500 && i < 550) {
                        data1.push(180);
                    }
                    else if (i > 700 && i < 740) {
                        data1.push(-90);
                    }
                    else {
                        data1.push(base);
                    }
                }

                chart.setOption({
                    visualMap: {
                        type: 'piecewise',
                        top: 'center',
                        inRange: {
                            color: ['red', 'green', 'black']
                        },
                        outOfRange: {
                            color: '#aaa'
                        },
                        dimension: 0,
                        min: 0,
                        max: 10
                    },
                    dataZoom: {
                        orient: 'vertical'
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    xAxis: {
                        data: xAxisData,
                        boundaryGap: false
                    },
                    yAxis: {},
                    series: [{
                        name: 'line',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        areaStyle: { normal: {} },
                        symbolSize: 10,
                        data: data1
                    }]
                });
            });

        </script>












        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('mainX');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

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

                var base = Math.round(Math.random() * 30);
                for (var i = 0; i < 1000; i++) {
                    xAxisData.push('类目' + i);
                    base += Math.round(Math.random() * 10 - 5);

                    if (i > 500 && i < 550) {
                        data1.push(180);
                    }
                    else if (i > 700 && i < 740) {
                        data1.push(-90);
                    }
                    else {
                        data1.push(base);
                    }
                }

                chart.setOption({
                    visualMap: {
                        type: 'piecewise',
                        top: 'center',
                        inRange: {
                            color: ['red', 'green', 'black']
                        },
                        outOfRange: {
                            color: '#aaa'
                        },
                        min: -70,
                        max: 150
                    },
                    dataZoom: {
                        orient: 'vertical'
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    xAxis: {
                        data: xAxisData,
                        boundaryGap: false
                    },
                    yAxis: {},
                    series: [{
                        name: 'line',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        areaStyle: { normal: {} },
                        symbolSize: 10,
                        data: data1
                    }]
                });
            });

        </script>









        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('mainX2');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

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

                var base = Math.round(Math.random() * 30);
                for (var i = 0; i < 1000; i++) {
                    xAxisData.push('类目' + i);
                    base += Math.round(Math.random() * 10 - 5);

                    if (i > 500 && i < 550) {
                        data1.push(180);
                    }
                    else if (i > 700 && i < 740) {
                        data1.push(-90);
                    }
                    else {
                        data1.push(base);
                    }
                }

                chart.setOption({
                    visualMap: {
                        type: 'piecewise',
                        top: 'center',
                        inRange: {
                            color: ['red', 'green', 'black']
                        },
                        outOfRange: {
                            color: '#aaa'
                        },
                        min: -70,
                        max: 150,
                        minOpen: true,
                        maxOpen: true
                    },
                    dataZoom: {
                        orient: 'vertical'
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    xAxis: {
                        data: xAxisData,
                        boundaryGap: false
                    },
                    yAxis: {},
                    series: [{
                        name: 'line',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        areaStyle: { normal: {} },
                        symbolSize: 10,
                        data: data1
                    }]
                });
            });

        </script>









        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('main0');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

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

                var base = Math.round(Math.random() * 100);
                for (var i = 0; i < 1000; i++) {
                    xAxisData.push('类目' + i);
                    base += Math.round(Math.random() * 10 - 5);

                    if (i > 500 && i < 550) {
                        data1.push(130);
                    }
                    else if (i > 700 && i < 740) {
                        data1.push(-20);
                    }
                    else {
                        data1.push(base);
                    }
                }

                chart.setOption({
                    visualMap: {
                        type: 'piecewise',
                        top: 'center',
                        inRange: {
                            color: ['red', 'green', 'black']
                        },
                        outOfRange: {
                            color: '#aaa'
                        },
                        pieces: [{
                            lte: 120,
                            gt: 100,
                            color: 'red'
                        }, {
                            lt: 80,
                            gt: 70
                        }, {
                            lt: 90,
                            gt: 50
                        }, {
                            lte: 40
                        }]
                    },
                    dataZoom: {
                        orient: 'vertical'
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    xAxis: {
                        data: xAxisData,
                        boundaryGap: false
                    },
                    yAxis: {},
                    series: [{
                        name: 'line',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        areaStyle: { normal: {} },
                        symbolSize: 10,
                        data: data1
                    }]
                });
            });

        </script>












        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('main1');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

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

                var base = -Math.round(Math.random() * 500 + 500);
                var min = Infinity;
                var max = -Infinity;
                for (var i = 0; i < 1000; i++) {
                    xAxisData.push('类目' + i);
                    base -= Math.round(Math.random() * 2);
                    data1.push(base);

                    base > max && (max = base);
                    base < min && (min = base);
                }

                max += 500;
                min -= 500;

                chart.setOption({
                    visualMap: {
                        top: 'center',
                        calculable: true,
                        type: 'continuous',
                        inRange: {
                            color: ['red', 'green', 'black']
                        },
                        outOfRange: {
                            color: '#aaa'
                        },
                        range: [min + 100, max - 100],
                        min: min,
                        max: max
                    },
                    dataZoom: {
                        orient: 'vertical'
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    xAxis: {
                        data: xAxisData,
                        boundaryGap: false
                    },
                    yAxis: {},
                    series: [{
                        name: 'line',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        areaStyle: { normal: {} },
                        symbolSize: 10,
                        data: data1
                    }]
                });
            });

        </script>












        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('main2');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

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

                var base = Math.round(Math.random() * 500 + 500);
                var min = Infinity;
                var max = -Infinity;
                for (var i = 0; i < 1000; i++) {
                    xAxisData.push('类目' + i);
                    base += Math.round(Math.random() * 500);
                    data1.push(base);

                    base > max && (max = base);
                    base < min && (min = base);
                }

                max += 100;
                min -= 100;

                chart.setOption({
                    visualMap: {
                        orient: 'horizontal',
                        left: 'center',
                        top: 0,
                        inverse: true,
                        calculable: true,
                        type: 'continuous',
                        inRange: {
                            color: ['red', 'green', 'black']
                        },
                        outOfRange: {
                            color: '#aaa'
                        },
                        range: [min + 80, max - 80],
                        dimension: 0,
                        min: min,
                        max: max
                    },
                    dataZoom: {
                        orient: 'vertical'
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    yAxis: {
                        data: xAxisData,
                        boundaryGap: false
                    },
                    xAxis: {
                        type: 'log',
                        inverse: true
                    },
                    series: [{
                        name: 'line',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        areaStyle: { normal: {} },
                        symbolSize: 10,
                        data: data1
                    }]
                });
            });

        </script>














        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                var main = document.getElementById('main4');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

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

                var base = Math.round(Math.random() * 100);
                var min = Infinity;
                var max = -Infinity;
                for (var i = 0; i < 1000; i++) {
                    xAxisData.push('类目' + i);
                    base += Math.round(Math.random() * 240 - 120);
                    data1.push(base);

                    base > max && (max = base);
                    base < min && (min = base);
                }

                var span = max - min;

                max -= span / 6;
                min += span / 6;

                chart.setOption({
                    visualMap: {
                        top: 'center',
                        calculable: true,
                        type: 'continuous',
                        inRange: {
                            color: ['red', 'green', 'black']
                        },
                        outOfRange: {
                            color: '#aaa'
                        },
                        min: min,
                        max: max
                    },
                    dataZoom: {
                        orient: 'vertical'
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    xAxis: {
                        data: xAxisData,
                        boundaryGap: false
                    },
                    yAxis: {},
                    series: [{
                        name: 'line',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        areaStyle: { normal: {} },
                        symbolSize: 10,
                        data: data1
                    }]
                });
            });

        </script>

    </body>
</html>