Snow蛋糕店-本周各类蛋糕销量-排序

描述:当前是关于Echarts图表中的 示例。
 
            //------------------------------------------------以下的变量为最终插入数据的变量------------------------------------------------------------
//条形图x轴
var xAxisBarChart = [];
//条形图数据
var dataBarChart = [];
//布朗尼一周销量(7个数)
var dataBrownies = [];
//马卡龙一周销量(7个数)
var dataMacarons = [];
//提拉米苏一周销量(7个数)
var dataTiramisu = [];
//时间轴数据
var timelineData = [];
//数据插入图表
var optionsData = [];

//------------------------------------------------以下的变量为数据转换时的变量------------------------------------------------------------
//极坐标轴显示星期几
var weekDay = 0;
//全数据数组
var sourceArray = [];
//判断是否排序
var SortOrNot = false;
//反序排序:从大到小
var compare = function(x, y) {
        if (x.value < y.value) {
            return 1;
        } else if (x.value > y.value) {
            return -1;
        } else {
            return 0;
        }
    }
    //柱状图数据的映射集合,实现排序的转换
var dataBarChartMap = new Map();
//柱状图数据的寄存器,最后一步再导入到dataBarChart中
var dataBarChartTemp = [];

//图表加载
option = {
    baseOption: {
        timeline: {
            x: 0,
            axisType: 'category',
            orient: 'vertical',
            autoPlay: true,
            playInterval: 1000,
            data: timelineData,
            left: 10,
            right: null,
            top: 50,
            bottom: 0,
            width: 70,
            height: null,
            inverse: true,
            symbol: 'none',
            lineStyle: {
                color: '#555'
            },
            checkpointStyle: {
                color: '#bbb',
                borderColor: '#777',
                borderWidth: 2
            },
            label: {
                normal: {
                    textStyle: {
                        color: '#999',
                        fontSize: 15
                    }
                },
                emphasis: {
                    textStyle: {
                        color: '#999',
                        fontSize: 20
                    }
                }
            },
        },
        title: {
            text: 'Snow蛋糕店-本周各类蛋糕销量',
            subtext: '点击极坐标系下即可与圆环图交互\n点击柱状图排序',
            textAlign: 'left'
        },
        tooltip: {
            trigger: 'item',
            padding: 10,
            backgroundColor: '#222',
            borderColor: '#777',
            borderWidth: 1,
            formatter: tooltipFormatter,

        },
        angleAxis: {
            type: 'category',
            data: [{
                value: '星期一',
                textStyle: {
                    fontSize: 25,
                }
            }, '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'],
            z: 10
        },
        grid: {
            left: '6%',
            right: '5%',
            top: '16%',
            bottom: '3%',
            containLabel: true
        },
        polar: {
            center: ['80%', '30%'],
            radius: 100,
        },
        xAxis: [{
            type: 'category',
            data: xAxisBarChart,
            axisLabel: {
                'interval': 0
            },
        }],
        yAxis: [{
            type: 'value',
            max: 600,
            show: false,
        }],
        radiusAxis: {},
        series: [{
            type: 'bar',
            data: dataBrownies,
            coordinateSystem: 'polar',
            name: '布朗尼',
            center: ['80%', '30%'],
            stack: 'a',
            itemStyle: {
                normal: {
                    borderWidth: 4,
                    borderColor: '#ffffff',
                },
                emphasis: {
                    borderWidth: 0,
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
            }
        }, {
            type: 'bar',
            data: dataMacarons,
            coordinateSystem: 'polar',
            name: '马卡龙',
            center: ['80%', '30%'],
            stack: 'a',
            itemStyle: {
                normal: {
                    borderWidth: 4,
                    borderColor: '#ffffff',
                },
                emphasis: {
                    borderWidth: 0,
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
            }
        }, {
            type: 'bar',
            data: dataTiramisu,
            coordinateSystem: 'polar',
            name: '提拉米苏',
            center: ['80%', '30%'],
            stack: 'a',
            itemStyle: {
                normal: {
                    borderWidth: 3,
                    borderColor: '#ffffff',
                },
                emphasis: {
                    borderWidth: 3,
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
            }
        }, {
            name: '每天销量',
            type: 'pie',
            center: ['80%', '30%'],
            radius: ['45%', '50%'],
            avoidLabelOverlap: false,
            label: {
                normal: {
                    show: true,
                    position: 'outside',
                    formatter: '{b} : {c} ({d}%)'

                },
                emphasis: {
                    show: true,
                    textStyle: {
                        fontSize: '15',
                        fontWeight: 'normal'
                    }
                },
                tooltip: {
                    trigger: 'item',
                    padding: 10,
                    backgroundColor: '#222',
                    borderColor: '#777',
                    borderWidth: 1,
                    formatter: tooltipFormatter,

                },
            },
            labelLine: {
                normal: {
                    show: false
                }
            },
            legend: {
                show: true,
                orient: 'vertical',
                x: 'left',
                y: 'bottom',
                data: ['布朗尼', '马卡龙', '提拉米苏']
            },
            itemStyle: {
                normal: {
                    borderWidth: 3,
                    borderColor: '#ffffff',
                },
                emphasis: {
                    show: true,
                    textStyle: {
                        fontSize: '15',
                        fontWeight: 'normal'
                    }
                }
            }
        }, {
            name: '半年销量',
            type: 'bar',
            avoidLabelOverlap: false,
            label: {
                normal: {
                    show: true,
                    position: 'outside',
                    formatter: '{c}'

                },
                emphasis: {
                    show: true,
                    textStyle: {
                        fontSize: '20',
                        fontWeight: 'normal'
                    }
                }
            },
            labelLine: {
                normal: {
                    show: false
                }
            },
            itemStyle: {
                normal: {
                    borderWidth: 3,
                    borderColor: '#ffffff',
                },
                emphasis: {
                    borderWidth: 3,
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
            }
        }]
    },
    options: optionsData,
}


//全数据计算
for (var week = 0; week < 26; week++) {
    var weekDataArray = [];
    for (var day = 0; day < 7; day++) {
         var productSales = [{
                'Brownies': parseInt(20 * Math.random()),
                'Macarons': parseInt(20 * Math.random()),
                'Tiramisu': parseInt(20 * Math.random())
            }];
            weekDataArray.push(productSales);
    }
    //一天的数据由3种蛋糕组成,一周由7天组成,半年由26周组成,所以写三个循环
    sourceArray.push(weekDataArray);
    timelineData.push('第' + (week + 1) + '周');
}

everyProductCalculate();
//现实情况下大多数都是根据数据源对数据进行切割和合并
function everyProductCalculate() {
    //数组容器重置
    dataBarChartMap = new Map();
    dataBarChartTemp = [];
    xAxisBarChart = [];
    dataBrownies = [];
    dataMacarons = [];
    dataTiramisu = [];
    optionsData = [];

    //柱状图数据计算,就是一周合计的计算
    for (var i = 0; i < sourceArray.length; i++) {
        var weekSum = 0;
        for (var j = 0; j < sourceArray[i].length; j++) {
            var daySum = 0;
            daySum = sourceArray[i][j][0].Brownies +
                sourceArray[i][j][0].Macarons +
                sourceArray[i][j][0].Tiramisu;
            weekSum = weekSum + daySum;
        }
        dataBarChartTemp.push(weekSum);
    }
    //数据插入到map集合中,由星期和每周销量相互对应
    for (var i = 1; i < sourceArray.length + 1; i++) {
        dataBarChartMap.put(i, dataBarChartTemp[i - 1]);

    }
    //是否排序
    if (SortOrNot) {
        dataBarChartMap.elements.sort(compare);
        dataBarChartTemp = dataBarChartMap.elements;
    }
    //得到dataBarChart,柱状图数据
    dataBarChart = dataBarChartTemp;
    for (var i = 0; i < sourceArray.length; i++) {
        var xAxisBarChartTemp = [];
        for (var j = 0; j < sourceArray.length; j++) {
            if (i == dataBarChartMap.elements[j].key - 1) {
                xAxisBarChartTemp.push('\n>第' + dataBarChartMap.elements[j].key + '周<');
            } else {
                xAxisBarChartTemp.push(dataBarChartMap.elements[j].key + '周');
            }
        }
        //得到xAxisBarChart,柱状图x轴数据
        xAxisBarChart.push(xAxisBarChartTemp);
    }
    //
    //每个产品全部销量计算(一个产品包含7个值)
    for (var i = 0; i < sourceArray.length; i++) {
        dataBrowniesTemp = [];
        dataMacaronsTemp = [];
        dataTiramisuTemp = [];
        for (var j = 0; j < sourceArray[i].length; j++) {
            dataBrowniesTemp.push(sourceArray[i][j][0].Brownies);
            dataMacaronsTemp.push(sourceArray[i][j][0].Macarons);
            dataTiramisuTemp.push(sourceArray[i][j][0].Tiramisu);
        }
        //得到蛋糕各自的数据
        dataBrownies.push(dataBrowniesTemp);
        dataMacarons.push(dataMacaronsTemp);
        dataTiramisu.push(dataTiramisuTemp);
    }
    for (var i = 0; i < sourceArray.length; i++) {
        optionsData.push({
            'series': [{
                    'data': dataBrownies[i]
                }, {
                    'data': dataMacarons[i]
                }, {
                    'data': dataTiramisu[i]
                }, {
                    'data': [{
                        value: dataBrownies[i][weekDay],
                        name: '布朗尼'
                    }, {
                        value: dataMacarons[i][weekDay],
                        name: '马卡龙'
                    }, {
                        value: dataTiramisu[i][weekDay],
                        name: '提拉米苏'
                    }]
                }, {
                    'data': dataBarChart
                },

            ],
            'xAxis': [{
                'data': xAxisBarChart[i],
            }]
        });
    }
    option.options = optionsData;

    myChart.setOption(option);
}







myChart.on('click', function(params) {
    //直接改变数据的内容
    if (params.componentSubType != 'pie' &&
        params.seriesName != '半年销量') {
        weekDay = params.dataIndex;
        for (var i = 0; i < option.baseOption.timeline.data.length; i++) {
            option.options[i].series[3].data[0].value = dataBrownies[i][weekDay];
            option.options[i].series[3].data[1].value = dataMacarons[i][weekDay];
            option.options[i].series[3].data[2].value = dataTiramisu[i][weekDay];
        }
        var weekDayData = ['星期一', '星期二', '星期三', '星期四', '星期五',
            '星期六', '星期日'
        ];
        weekDayData[weekDay] = {
            value: weekDayData[weekDay],
            textStyle: {
                fontSize: 25,
            }
        };
        option.baseOption.timeline.autoPlay = false;
        option.baseOption.angleAxis.data = weekDayData;
        myChart.setOption(option);
    }
    //重新执行数据转换过程
    else if (params.componentSubType == 'bar' &&
        params.seriesName == '半年销量') {
        if (SortOrNot == false) {
            SortOrNot = true;
        } else {
            SortOrNot = false;
        }
        everyProductCalculate();
        option.options = optionsData;
        myChart.setOption(option);
    }
});
//提示框体
function tooltipFormatter(params) {
    var valuesFormatter = [];
    if (params.componentSubType == 'pie') {
        valuesFormatter
            .push('<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">' +
                '本日销量' +
                '<br>' +
                '</div>' +
                '<span style="color:' +
                params.color +
                '">' + params.name + '</span>: ' + params.value);
    } else {
        valuesFormatter
            .push('<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">' +
                params.seriesName +
                '</div>' +
                '<span style="color:' +
                params.color +
                '">' +
                params.name +
                '</span>: ' +
                params.value + '<br>');
    }

    return valuesFormatter;
}
//map集合,这里应该写在工具脚本中
function Map() {
    this.elements = new Array();

    // 获取Map元素个数
    this.size = function() {
            return this.elements.length;
        },

        // 判断Map是否为空
        this.isEmpty = function() {
            return (this.elements.length < 1);
        },

        // 删除Map所有元素
        this.clear = function() {
            this.elements = new Array();
        },

        // 向Map中增加元素(key, value)
        this.put = function(_key, _value) {
            if (this.containsKey(_key) == true) {
                if (this.containsValue(_value)) {
                    if (this.remove(_key) == true) {
                        this.elements.push({
                            key: _key,
                            value: _value
                        });
                    }
                } else {
                    this.elements.push({
                        key: _key,
                        value: _value
                    });
                }
            } else {
                this.elements.push({
                    key: _key,
                    value: _value
                });
            }
        },

        // 删除指定key的元素,成功返回true,失败返回false
        this.remove = function(_key) {
            var bln = false;
            try {
                for (i = 0; i < this.elements.length; i++) {
                    if (this.elements[i].key == _key) {
                        this.elements.splice(i, 1);
                        return true;
                    }
                }
            } catch (e) {
                bln = false;
            }
            return bln;
        },

        // 获取指定key的元素值value,失败返回null
        this.get = function(_key) {
            try {
                for (i = 0; i < this.elements.length; i++) {
                    if (this.elements[i].key == _key) {
                        return this.elements[i].value;
                    }
                }
            } catch (e) {
                return null;
            }
        },

        // 获取指定索引的元素(使用element.key,element.value获取key和value),失败返回null
        this.element = function(_index) {
            if (_index < 0 || _index >= this.elements.length) {
                return null;
            }
            return this.elements[_index];
        },

        // 判断Map中是否含有指定key的元素
        this.containsKey = function(_key) {
            var bln = false;
            try {
                for (i = 0; i < this.elements.length; i++) {
                    if (this.elements[i].key == _key) {
                        bln = true;
                    }
                }
            } catch (e) {
                bln = false;
            }
            return bln;
        },

        // 判断Map中是否含有指定value的元素
        this.containsValue = function(_value) {
            var bln = false;
            try {
                for (i = 0; i < this.elements.length; i++) {
                    if (this.elements[i].value == _value) {
                        bln = true;
                    }
                }
            } catch (e) {
                bln = false;
            }
            return bln;
        },

        // 获取Map中所有key的数组(array)
        this.keys = function() {
            var arr = new Array();
            for (i = 0; i < this.elements.length; i++) {
                arr.push(this.elements[i].key);
            }
            return arr;
        },

        // 获取Map中所有value的数组(array)
        this.values = function() {
            var arr = new Array();
            for (i = 0; i < this.elements.length; i++) {
                arr.push(this.elements[i].value);
            }
            return arr;
        };
}