
<!--
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" />
    </head>
    <body>
        <div id="main"></div>

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

                chart = echarts.init(document.getElementById('main'));

                var data = [
                    {"name": "USA", "value": 15276.0},
                    {"name": "UK", "value": 4855.0},
                    {"name": "France", "value": 3291.0},
                    {"name": "Italy", "value": 3157.0},
                    {"name": "Spain", "value": 2859.0},
                    {"name": "Brazil", "value": 1662.0},
                    {"name": "Others", "value": 5152.0}
                ];
                var data2 = [
                    {"value": 15276.0},
                    {"value": 4855.0},
                    {"value": 3291.0},
                    {"value": 3157.0},
                    {"value": 2859.0},
                    {"value": 1662.0},
                    {"value": 5152.0}
                ];
                var data3 = [
                    15276.0,
                    4855.0,
                    3291.0,
                    3157.0,
                    2859.0,
                    1662.0,
                    5152.0
                ];

                chart.setOption({
                    toolbox: {
                        feature: {
                            dataView:{
                                readOnly: false
                            },
                            restore: {}
                        }
                    },
                    tooltip: {
                        trigger: 'item',
                        formatter: '{a} <br/>{b} : {c} ({d}%)'
                    },
                    series: [{
                        name: 'Total deaths of various countries',
                        type: 'pie',
                        data: data,
                        radius: '50%',
                        clockwise: false,
                        label: {
                            formatter: "{b} : {num|{c}} | {rate|{d}%}",
                            color: "black",
                            fontSize: 20,
                            rich: {
                                num: {
                                    fontSize: 22,
                                    fontWeight: 'bold',
                                    color: "black"
                                },
                                rate: {
                                    fontSize: 22,
                                    fontWeight: 'bold',
                                    color: "black"
                                },
                                symbol: {
                                    fontSize: 22,
                                    color: "black"
                                }
                            }
                        },
                        emphasis: {
                            itemStyle: {
                                shadowBlur: 10,
                                shadowOffsetX: 0,
                                shadowColor: 'rgba(0, 0, 0, 0.5)'
                            }
                        }
                    }]
                });

            });

        </script>

    </body>
</html>
