
<!--
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/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <link rel="stylesheet" href="lib/reset.css">
        <script src="lib/jquery.min.js"></script>
    </head>
    <body>
        <style>
            .main {
                height: 400px;
                margin: 10px 0 80px 0;
            }
            .label {
                background: #ddd;
                line-height: 30px;
                font-weight: bold;
                text-align: center;
            }
        </style>
        <div class="label">Color Alpha in scatter (using outOfRange as 'selected')</div>
        <div class="main" id="main1"></div>
        <div class="label">Opacity in bar (label color specified)</div>
        <div class="main" id="main2"></div>
        <div class="label">Opacity in scatter (label color specified)</div>
        <div class="main" id="main3"></div>
        <div class="label">Opacity in graph (label color specified)</div>
        <div class="main" id="main4"></div>
        <div class="label">Opacity in heatmap (inactive color default using opacity)</div>
        <div class="main" id="main5"></div>
        <div class="label">Opacity in pie (label color and label line color specified)</div>
        <div class="main" id="main6"></div>






        <!-- ALPHA SCATTER -->


        <script type="text/javascript">

            require([
                'echarts'
            ], function (echarts) {

                var main = document.getElementById('main1');
                if (!main) {
                    return;
                }
                var chart = echarts.init(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))
                    ]);
                }

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

                chart.setOption({
                    color: ['#bcd3bb', '#928ea8', '#edc1a5'],
                    legend: {
                        data: ['scatter', 'scatter2', 'scatter3']
                    },
                    grid: {
                        top: 50,
                        bottom: 30
                    },
                    xAxis: {
                        type: 'value',
                        splitLine: {
                            show: false
                        }
                    },
                    yAxis: {
                        type: 'value',
                        splitLine: {
                            show: false
                        }
                    },
                    visualMap: [
                        {
                            type: 'piecewise',
                            splitNumber: 6,
                            left: 'right',
                            bottom: 30,
                            // selectedMode: 'single',
                            selectedMode: 'multiple',
                            selected: {
                                0: false, 1: false, 2: false, 3: false, 4: false, 5: false
                            },
                            dimension: 'value',
                            min: 0,
                            max: 24,
                            precision: 0,
                            inRange: { // visual for short cut
                                color: ['rgb(20,1,0)'],
                                symbolSize: [40, 5]
                            },
                            outOfRange: {
                                colorAlpha: [0.3, 1],
                                symbolSize: [40, 5]
                            }
                        }
                    ],
                    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
                        }
                    ]
                });

                window.addEventListener('resize', function () {
                    chart.resize();
                });
            });
        </script>











        <!-- OPACITY BAR -->


        <script>

            require(['echarts'], function (echarts) {

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

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

                var DATA_MAX = 5.5;

                for (var i = 0; i < 10; i++) {
                    xAxisData.push('类目' + i);
                    data1.push((Math.random() * DATA_MAX).toFixed(2));
                    data2.push(-Math.random().toFixed(2));
                    data3.push((Math.random() + 0.5).toFixed(2));
                    data4.push((Math.random() + 0.3).toFixed(2));
                }

                var labelStyle = {
                    normal: {
                        show: true,
                        position: 'outside',
                        textStyle: {
                            color: '#333'
                        }
                    }
                };

                var itemStyle = {
                    normal: {
                    },
                    emphasis: {
                        shadowBlur: 10,
                        shadowOffsetX: 0,
                        shadowOffsetY: 0,
                        shadowColor: 'rgba(0,0,0,0.5)'
                    }
                };

                chart.setOption({
                    legend: {
                        data: ['bar', 'bar2', 'bar3'],
                        align: 'left'
                    },
                    toolbox: {
                        // y: 'bottom',
                        feature: {
                            magicType: {
                                type: ['line', 'bar', 'stack', 'tiled']
                            },
                            dataView: {}
                        }
                    },
                    tooltip: {},
                    xAxis: {
                        data: xAxisData,
                        axisLine: {
                            onZero: true
                        },
                        splitLine: {
                            show: false
                        },
                        splitArea: {
                            show: false
                        }
                    },
                    yAxis: {
                        splitArea: {
                            show: false
                        },
                        max: 6,
                        min: -2
                    },
                    visualMap: [
                        {
                            type: 'continuous',
                            right: 0,
                            itemWidth: 15,
                            bottom: 30,
                            dimension: 1,
                            calculable: true,
                            min: -2,
                            max: DATA_MAX,
                            precision: 2,
                            inRange: {
                                opacity: [1, 1] // Using opacity when label color specified
                            },
                            controller: {
                                inRange: {
                                    color: '#888'
                                },
                                outOfRange: {
                                    color: '#888'
                                }
                            },
                            outOfRange: {
                                opacity: [0.2, 0.2] // Using opacity when label color specified
                            }
                        }
                    ],
                    series: [
                        {
                            name: 'bar',
                            type: 'bar',
                            stack: 'one',
                            itemStyle: itemStyle,
                            label: labelStyle,
                            data: data1
                        },
                        {
                            name: 'bar2',
                            type: 'bar',
                            stack: 'one',
                            itemStyle: itemStyle,
                            label: labelStyle,
                            data: data2
                        },
                        {
                            name: 'bar3',
                            type: 'bar',
                            itemStyle: itemStyle,
                            label: labelStyle,
                            data: data3
                        }
                    ]
                });

                window.addEventListener('resize', function () {
                    chart.resize();
                });
            });
        </script>











        <!-- OPACITY SCATTER -->


        <script type="text/javascript">

            require([
                'echarts'
            ], function (echarts) {

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

                var data1 = [];

                var symbolCount = 6;

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

                chart.setOption({
                    legend: {
                        data: ['scatter', 'scatter2', 'scatter3']
                    },
                    grid: {
                        top: 50,
                        bottom: 30
                    },
                    xAxis: {
                        type: 'value',
                        splitLine: {
                            show: false
                        }
                    },
                    yAxis: {
                        type: 'value',
                        splitLine: {
                            show: false
                        }
                    },
                    visualMap: [
                        {
                            type: 'piecewise',
                            splitNumber: 6,
                            left: 'right',
                            bottom: 30,
                            selectedMode: 'multiple',
                            dimension: 'value',
                            min: 0,
                            max: 24,
                            precision: 0,
                            inRange: { // visual for short cut
                                opacity: 1,
                                symbolSize: [15, 50]
                            },
                            outOfRange: {
                                opacity: 0.3,
                                symbolSize: [15, 50]
                            }
                        }
                    ],
                    series: [
                        {
                            name: 'scatter',
                            type: 'scatter',
                            itemStyle: {
                                normal: {
                                    opacity: 0.8,
                                    shadowBlur: 10,
                                    shadowOffsetX: 0,
                                    shadowOffsetY: 0,
                                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                                }
                            },
                            label: {
                                normal: {
                                    show: true,
                                    formatter: '{@[2]}',
                                    position: 'inside'
                                }
                            },
                            data: data1
                        }
                    ]
                });

                window.addEventListener('resize', function () {
                    chart.resize();
                });
            });
        </script>






        <!-- OPACITY GRAPH -->

        <script>

            require([
                'echarts',
                'extension/dataTool',
                './data/les-miserables.gexf',
                'theme/vintage'
            ], function (echarts, dataTool, xml) {
                var gexf = dataTool.gexf;
                var main = document.getElementById('main4');
                if (!main) {
                    return;
                }
                var chart = echarts.init(main);

                var graph = gexf.parse(xml);
                var categories = [];
                for (var i = 0; i < 9; i++) {
                    categories[i] = {
                        name: '类目' + i
                    };
                }
                graph.nodes.forEach(function (node) {
                    delete node.itemStyle;
                    node.value = node.symbolSize;
                    node.label = {
                        normal: {
                            show: node.symbolSize > 30
                        }
                    };
                    node.category = node.attributes['modularity_class'];
                });
                graph.links.forEach(function (link) {
                    delete link.lineStyle;
                });
                var option = {
                    tooltip: {},
                    legend: [{
                        // selectedMode: 'single',
                        data: categories.map(function (a) {
                            return a.name;
                        })
                    }],
                    visualMap: {
                        min: 0,
                        max: 100,
                        dimension: 0,
                        calculable: true,
                        inRange: {
                            opacity: 1,
                            symbolSize: [10, 100]
                        },
                        outOfRange: {
                            opacity: 0.2,
                            symbolSize: [10, 100]
                        }
                    },
                    animationDurationUpdate: 1500,
                    animationEasingUpdate: 'quinticInOut',
                    series : [
                        {
                            name: 'Les Miserables',
                            type: 'graph',
                            layout: 'none',
                            data: graph.nodes,
                            links: graph.links,
                            categories: categories,
                            roam: true,
                            label: {
                                normal: {
                                    textStyle: {
                                        color: '#333'
                                    },
                                    position: 'right',
                                    formatter: '{b}'
                                }
                            },
                            lineStyle: {
                                normal: {
                                    curveness: 0.3
                                }
                            }
                        }
                    ]
                };

                chart.setOption(option);

            });
        </script>






        <!-- OPACITY HEATMAP -->

        <script type="text/javascript">

            require([
                'echarts'
            ], function (echarts) {

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

                });

                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]];

                data = data.map(function (item) {
                    return [item[1], item[0], item[2] || '-'];
                });

                option = {
                    backgroundColor: '#eee4ee',
                    tooltip: {
                        position: 'top'
                    },
                    animation: false,
                    grid: {
                        height: '50%',
                        y: '10%'
                    },
                    xAxis: {
                        type: 'category',
                        data: hours
                    },
                    yAxis: {
                        type: 'category',
                        data: days
                    },
                    visualMap: {
                        min: 1,
                        max: 10,
                        calculable: true,
                        range: [3, 6],
                        orient: 'horizontal',
                        left: 'center',
                        bottom: '15%'
                    },
                    series: [{
                        name: 'Punch Card',
                        type: 'heatmap',
                        data: data,
                        label: {
                            normal: {
                                show: true
                            }
                        },
                        itemStyle: {
                            emphasis: {
                                shadowBlur: 10,
                                shadowColor: 'rgba(0, 0, 0, 0.5)'
                            }
                        }
                    }]
                };

                chart.setOption(option);
            });
        </script>









        <!-- OPACITY HEATMAP -->

        <script>
            require([
                'echarts'
            ], function (echarts) {

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

                chart.setOption({
                    legend: {
                        data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']
                    },
                    tooltip: {},
                    visualMap: {
                        type: 'continuous',
                        top: 'middle',
                        min: 0,
                        max: 700,
                        dimension: 1,
                        calculable: true,
                        inRange: {
                            color: ['yellow', 'green']
                        }
                    },
                    series: [{
                        name: 'pie',
                        type: 'pie',
                        selectedMode: 'single',
                        selectedOffset: 30,
                        clockwise: true,
                        label: {
                            normal: {
                                textStyle: {
                                    color: '#333'
                                }
                            }
                        },
                        labelLine: {
                            normal: {
                                lineStyle: {
                                    color: '#333'
                                }
                            }
                        },
                        data:[
                            {value: [335, 632], name:'直接访问'},
                            {value: [310, 434], name:'邮件营销'},
                            {value: [234, 233], name:'联盟广告'},
                            {value: [135, 544], name:'视频广告'},
                            {value: [1548, 381], name:'搜索引擎'}
                        ]
                    }]
                });
            });
        </script>

    </body>
</html>