
<!--
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>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/draggable.js"></script>
        <link rel="stylesheet" href="lib/reset.css">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
    </head>
    <body>
        <style>
            body {
                position: absolute;
                left: 0;
                top: 0;
            }
            #main {
                position: absolute;
                top: 10px;
                left: 10px;
                width: 700px;
                height: 650px;
                background: #fff;
            }
        </style>
        <div id="main"></div>

        <script src="data/timelineGDP.js"></script>

        <script>


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

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

                });

                draggable.init(
                    document.getElementById('main'),
                    chart,
                    {throttle: 70}
                );




                option = {
                    title : {
                        text: '南丁格尔玫瑰图',
                        subtext: '纯属虚构',
                        x:'center'
                    },
                    tooltip : {
                        trigger: 'item',
                        formatter: "{a} <br/>{b} : {c} ({d}%)"
                    },
                    legend: {
                        data:['rose1','rose2','rose3','rose4','rose5','rose6','rose7','rose8']
                    },
                    toolbox: {
                        show : true,
                        feature : {
                            mark : {show: true},
                            dataView : {show: true, readOnly: false},
                            magicType : {
                                show: true,
                                type: ['pie', 'funnel']
                            },
                            restore : {show: true},
                            saveAsImage : {show: true}
                        }
                    },
                    calculable : true,
                    series : [
                        {
                            name:'半径模式',
                            type:'pie',
                            roseType : 'radius',
                            label: {
                                normal: {
                                    show: false
                                },
                                emphasis: {
                                    show: true
                                }
                            },
                            lableLine: {
                                normal: {
                                    show: false
                                },
                                emphasis: {
                                    show: true
                                }
                            },
                            data:[
                                {value:10, name:'rose1'},
                                {value:5, name:'rose2'},
                                {value:15, name:'rose3'},
                                {value:25, name:'rose4'},
                                {value:20, name:'rose5'},
                                {value:35, name:'rose6'},
                                {value:30, name:'rose7'},
                                {value:40, name:'rose8'}
                            ]
                        },
                        {
                            name:'面积模式',
                            type:'pie',
                            roseType : 'area',
                            data:[
                                {value:10, name:'rose1'},
                                {value:5, name:'rose2'},
                                {value:15, name:'rose3'},
                                {value:25, name:'rose4'},
                                {value:20, name:'rose5'},
                                {value:35, name:'rose6'},
                                {value:30, name:'rose7'},
                                {value:40, name:'rose8'}
                            ]
                        }
                    ],
                    media: [
                        {
                            option: {
                                legend: {
                                    right: 'center',
                                    bottom: 0,
                                    orient: 'horizontal'
                                },
                                series: [
                                    {
                                        radius: [20, 110],
                                        center: ['25%', 200]
                                    },
                                    {
                                        radius: [30, 110],
                                        center: ['75%', 200]
                                    }
                                ]
                            }
                        },
                        {
                            query: {
                                minAspectRatio: 1
                            },
                            option: {
                                legend: {
                                    right: 'center',
                                    bottom: 0,
                                    orient: 'horizontal'
                                },
                                series: [
                                    {
                                        radius: [20, 110],
                                        center: ['25%', 200]
                                    },
                                    {
                                        radius: [30, 110],
                                        center: ['75%', 200]
                                    }
                                ]
                            }
                        },
                        {
                            query: {
                                maxAspectRatio: 1
                            },
                            option: {
                                legend: {
                                    right: 'center',
                                    bottom: 0,
                                    orient: 'horizontal'
                                },
                                series: [
                                    {
                                        radius: [20, 110],
                                        center: [200, '30%']
                                    },
                                    {
                                        radius: [30, 110],
                                        center: [200, '70%']
                                    }
                                ]
                            }
                        },
                        {
                            query: {
                                maxWidth: 500
                            },
                            option: {
                                legend: {
                                    right: 10,
                                    top: '15%',
                                    orient: 'vertical'
                                },
                                series: [
                                    {
                                        radius: [20, 110],
                                        center: [200, '30%']
                                    },
                                    {
                                        radius: [30, 110],
                                        center: [200, '75%']
                                    }
                                ]
                            }
                        }
                    ]
                };








                chart.setOption(option);

                chart.on('legendSelected', function () {
                });

                window.onresize = chart.resize;
            });
        </script>
    </body>
</html>