zoukankan      html  css  js  c++  java
  • echarts 解决 X轴与Y轴数据不对应问题;X轴日期显示顺序错误问题

    data 是 装满对象的数组。

    注意: 叠加柱状图需要赋值 xData,而曲线可要可不要。

    initChart3 是初始化叠加柱状图 
    initChart2 是初始化 曲线图
        var chart3, chart2
        function initChart3(data) {
            var chartId = "chart3" ;
            //$("#" + chartId).height(400);
            var chart = echarts.init(document.getElementById(chartId), 'light');
            var yAxisName = "微博数量3";
            var color;
            var titleText="";
            chart3 = chart;
            var series = [];
          
            //方式一
            var xData0 = arrayObjectDistinctReturnKey(data, 'YearAndMonth');//日期去重
            //解决日期排序问题
            var xData = sortData2(xData0, "order");//仅对日期排序
            //叠加柱状图需要赋值 xData,而曲线可要可不要。
             //方式二
            //var data = sortData(data2, "order", "YearAndMonth");//data2指数据源,这里对整个数据源排序
            //var xData = arrayObjectDistinctReturnKey(data2, 'YearAndMonth');
            //console.log('data', data);
            //console.log('xData', xData);
    
           
    
    		for (let i = 0; i < typeValueList.length; i++) {
    
    		    var arr1 = [];
    		    for (var j = 0; j < data.length; j++) {
    		        var item = data[j];
    		        if (item["WeiboType"] == typeValueList[i]) {
    		            arr1.push([item["YearAndMonth"], item["Number"]]);
    		        }
    		    }
    
    		    var seriesData = [];
    		    series.push({
    		        name: typeLabelList[i],
    		        type: 'bar',
    		        data: arr1,
    		        //barWidth: 21,
    		        stack: '叠加标志',
    		       
    		        //itemStyle: {//柱状图上方显示数值
    		        //    normal: {
    		        //        label: {
    		        //            show: true, //开启显示
    		        //            position: 'top', //在上方显示
    		        //            textStyle: { //数值样式
    		        //                color: 'black',
    		        //                 fontSize: 16
    		        //            }
    		        //        }
    		        //    }
    		        //}
    
    		    })
    		}
          //console.log('series', series);
    	   var option=
            {
                color: ['rgb(255,219,92)', 'rgb(55,162,218)', 'rgb(224,98,174)', 'rgb(255,159,127)'],
                title: [
                    {
                        top: 14,
                        text: titleText,
                        show: true,
                        left: "center"
                    }
    
                ],
                tooltip: {
                    trigger: 'axis',
                    confine: true,
                    formatter: function (data) {
                        return TooltipFormatterX(data);//解决日期排序问题
                    }
                },
                legend: {
                    top: 30,
                    type: 'scroll',
                    left: '13%',
                    data: typeLabelList
                },
                toolbox: {
                    right: '20px',
                    // left: 'right',
                    feature: {
                        dataView: {
                            show: true,
                            title: '数据视图',
                            lang: ['<div class="table-header-title" >' + titleText + '</div>', '关闭'],
                            readOnly: true, // 点击刷新按钮会导致第二列数据消失,此处设置只读是为了隐藏刷新按钮。
                            optionToContent: function (opt) {
                                // console.log('bar-opt', opt)
                                return ToolboxDataViewX(opt, xData);//解决日期排序问题
                            }
                        },
                        saveAsImage: { show: true }
                    }
                },
                grid: {
                    top: 70,
                    left: '3%',
                    right: '4%',
                    bottom: '5%',
                   // bottom: '10%',
    
                    containLabel: true,
    
                },
                xAxis: [
                    {
                        type: 'category',
                        data: xData,
                        axisLabel: {
                            interval: 0,  //坐标轴刻度标签的显示间隔.设置成 0 强制显示所有标签。设置为 1,隔一个标签显示一个标签。
                            rotate: 45,//倾斜度 -90 至 90 默认为0
                            //textStyle: {
                            //    fontWeight: "bold",  //加粗
                            //    color: "#000000"   //黑色
                            //},
                        },
                    }
                ],
                yAxis: [
                    {
                        type: 'value',
                        name: yAxisName,
                        //min: 0,
                        //max:500
                        //min: function (value) {
                        //    return value.min;
                        //},
                        //max: function (value) {
                        //    return value.max;
                        //}
    
                    }
                ],
    
                series: series,
            }
    		chart.setOption(option);//必须加true,否则叠加状态只更新部分值,而不去覆盖。
    
        }
    
    
        function initChart2(data) {
    
            var chartId = "chart2" ;
            //$("#" + chartId).height(400);
            var chart = echarts.init(document.getElementById(chartId), 'light');
            var yAxisName = "情感分值";
            var color;
            var titleText="";
            chart1 = chart;
            var series = [];
    
    
            //var data = sortData(data, "order", "YearAndMonth");
            //var xData = arrayObjectDistinctReturnKey(data, 'YearAndMonth');
            var xData0 = arrayObjectDistinctReturnKey(data, 'YearAndMonth');
            var xData = sortData2(xData0, "order");//解决日期排序问题
    
    
            for (let i = 0; i < typeValueArr.length; i++) {
    
                var arr1 = [];
                
                    for (var j = 0; j < data.length; j++) {
                        var item = data[j];
                        if (item["WeiboType"] == typeValueArr[i]) {
                            arr1.push([item["YearAndMonth"], item["EmotionAnalysis"]]);//解决日期排序问题
    
                        }
                    }
                
                //console.log('arr1',arr1);
    		    var seriesData=[];
                series.push({
                    name: typeLabelArr[i],
                    type: 'line',
                    data: arr1,
                    smooth: true, //这句就是让曲线变平滑的
                    connectNulls: true,
                    //barWidth: 21,
    				//stack: '叠加标志',
    
                    //itemStyle: {//柱状图上方显示数值
                    //    normal: {
                    //        label: {
                    //            show: true, //开启显示
                    //            position: 'top', //在上方显示
                    //            textStyle: { //数值样式
                    //                color: 'black',
                    //                 fontSize: 16
                    //            }
                    //        }
                    //    }
                    //}
    
                })
            }
           // console.log('series', series);
    	   var option=
            {
                color: ['rgb(175,238,238)', 'rgb(255,219,92)', 'rgb(55,162,218)', 'rgb(224,98,174)', 'rgb(255,159,127)'],
                title: [
                    {
                        top: 14,
                        text: titleText,
                        show: true,
                        left: "center"
                    }
    
                ],
                tooltip: {
                    trigger: 'axis',
                    confine: true,
                    formatter: function (data) {
                        return TooltipFormatterX(data);//解决日期排序问题
                    }
                },
                legend: {
                    top: 30,
                    type: 'scroll',
                    left: '13%',
                    data: typeLabelArr
                },
                toolbox: {
                    right: '20px',
                    // left: 'right',
                    feature: {
                        dataView: {
                            show: true,
                            title: '数据视图',
                            lang: ['<div class="table-header-title" >' + titleText + '</div>', '关闭'],
                            readOnly: true, // 点击刷新按钮会导致第二列数据消失,此处设置只读是为了隐藏刷新按钮。
                            optionToContent: function (opt) {
                                // console.log('bar-opt', opt)
                                return ToolboxDataViewX(opt, xData);//解决日期排序问题
                            }
                        },
                        saveAsImage: { show: true }
                    }
                },
                grid: {
                    top: 70,
                    left: '3%',
                    right: '4%',
                    bottom: '5%',
                   // bottom: '10%',
    
                    containLabel: true,
    
                },
                xAxis: [
                    {
                        type: 'category',
                       // data: xData,
                        axisLabel: {
                            interval: 0,  //坐标轴刻度标签的显示间隔.设置成 0 强制显示所有标签。设置为 1,隔一个标签显示一个标签。
                              rotate: 45,//倾斜度 -90 至 90 默认为0
                            //textStyle: {
                            //    fontWeight: "bold",  //加粗
                            //    color: "#000000"   //黑色
                            //},
                        },
                    }
                ],
                yAxis: [
                    {
                        type: 'value',
                        name: yAxisName,
                        //min: 0,
                        //max:500
                        //min: function (value) {
                        //    return value.min;
                        //},
                        //max: function (value) {
                        //    return value.max;
                        //}
    
                    }
                ],
    
                series: series,
            }
    		chart.setOption(option);//必须加true,否则叠加状态只更新部分值,而不去覆盖。
    
        }
    
    
        // X轴无值
        function ToolboxDataViewX(opt, axisData) {
            console.log("ToolboxDataViewX", opt);
            var series = opt.series; //折线图数据
            var tdHeads = '<td  style="padding: 0 10px">时间</td>'; //表头第一列
            var tdBodys = ''; //表数据
    
            //饼图
            if (opt.series[0].type == "pie") {
                //组装表头
                for (var i = 0, len = series[0].data.length; i < len; i++) {
                    tdHeads += '<td style="padding: 0 10px">' + series[0].data[i].name + '</td>';
                }
                var table = '<table  border="1" class="table-bordered table-striped" style="100%;text-align:center" ><tbody><tr>' + tdHeads + ' </tr>';
    
                //行数
                //列数
                for (var i = 0, len = series[0].data.length; i < len; i++) {
                    var temp = series[0].data[i].value;
                    if (temp != null && temp != undefined) {
                        tdBodys += '<td>' + temp + '</td>';
                    } else {
                        tdBodys += '<td></td>';
                    }
                }
                table += '<tr><td style="padding: 0 10px">' + "合计" + '</td>' + tdBodys + '</tr>';
                tdBodys = '';
    
    
            } else { //柱状图 曲线图
                //组装表头
                for (var i = 0; i < series.length; i++) {
                    tdHeads += '<td style="padding: 0 10px">' + series[i].name + '</td>';
                }
                var table = '<table  border="1" class="table-bordered table-striped" style="100%;text-align:center" ><tbody><tr>' + tdHeads + ' </tr>';
    
                //var axisData = opt.xAxis[0].data; //坐标数据
                var sumObj = {};
                var tdBodysSum = '';//合计行数据
                //合计行数据 初始化为0
                for (var j = 0; j < series.length ; j++) {
                    sumObj[series[j].name] = 0;
                }
                //console.log("sumObj0", sumObj);
                //组装表数据
                //行数
                for (var i = 0; i < axisData.length; i++) {
                    //列数
                    for (var j = 0; j < series.length ; j++) {
                        
                        //返回日期相同项
                        for (let k = 0, len = series[j].data.length; k < len; k++) {
    
                            if (axisData[i] == series[j].data[k][0]) {
                                var temp = series[j].data[k][1];
                                if (temp != null && temp != undefined) {
                                    tdBodys += '<td>' + temp + '</td>';
                                    sumObj[series[j].name] += temp;
                                } else {
                                    tdBodys += '<td></td>';
                                }
                            }
                        }
    
    
                    }
                    table += '<tr><td style="padding: 0 10px">' + axisData[i] + '</td>' + tdBodys + '</tr>';
                    tdBodys = '';
                }
                //console.log("sumObj", sumObj);
                //拼接合计行表格
                for (var j = 0; j < series.length ; j++) {
                    tdBodysSum += '<td>' + sumObj[series[j].name] + '</td>'
                }
                //console.log("tdBodysSum", tdBodysSum);
                // table += '<tr><td style="padding: 0 10px">' + '合计' + '</td>' + tdBodysSum + '</tr>';
    
            }
            table += '</tbody></table>';
            return table;
        }
    
        function ToolboxDataView(opt) {
          console.log("ToolboxDataView", opt);
            var series = opt.series; //折线图数据
            var tdHeads = '<td  style="padding: 0 10px">时间</td>'; //表头第一列
            var tdBodys = ''; //表数据
    
            //饼图
            if (opt.series[0].type == "pie") {
                //组装表头
                for (var i = 0,len= series[0].data.length; i <len; i++) {
                    tdHeads += '<td style="padding: 0 10px">' + series[0].data[i].name + '</td>';
                }
                var table = '<table  border="1" class="table-bordered table-striped" style="100%;text-align:center" ><tbody><tr>' + tdHeads + ' </tr>';
    
                  //行数
                    //列数
                    for (var i = 0, len = series[0].data.length; i < len; i++) {
                        var temp = series[0].data[i].value;
                        if (temp != null && temp != undefined) {
                            tdBodys += '<td>' + temp + '</td>';
                        } else {
                            tdBodys += '<td></td>';
                        }
                    }
                   table += '<tr><td style="padding: 0 10px">' + "合计" + '</td>' + tdBodys + '</tr>';
                    tdBodys = '';
    
    
            } else { //柱状图
                //组装表头
                for (var i = 0; i < series.length; i++) {
                    tdHeads += '<td style="padding: 0 10px">' + series[i].name + '</td>';
                }
                var table = '<table  border="1" class="table-bordered table-striped" style="100%;text-align:center" ><tbody><tr>' + tdHeads + ' </tr>';
    
                var axisData = opt.xAxis[0].data; //坐标数据
                var sumObj = {};
                var tdBodysSum = '';//合计行数据
                //合计行数据 初始化为0
                for (var j = 0; j < series.length ; j++) {
                    sumObj[series[j].name] = 0;
                }
                //console.log("sumObj0", sumObj);
                //组装表数据
                //行数
                for (var i = 0; i < axisData.length; i++) {
                    //列数
                    for (var j = 0; j < series.length ; j++) {
                        var temp = series[j].data[i];
                        if (temp != null && temp != undefined) {
                            tdBodys += '<td>' + temp + '</td>';
                            sumObj[series[j].name] += temp;
                        } else {
                            tdBodys += '<td></td>';
                        }
                    }
                    table += '<tr><td style="padding: 0 10px">' + axisData[i] + '</td>' + tdBodys + '</tr>';
                    tdBodys = '';
                }
                //console.log("sumObj", sumObj);
                //拼接合计行表格
                for (var j = 0; j < series.length ; j++) {
                    tdBodysSum += '<td>' + sumObj[series[j].name] + '</td>'
                }
                //console.log("tdBodysSum", tdBodysSum);
               // table += '<tr><td style="padding: 0 10px">' + '合计' + '</td>' + tdBodysSum + '</tr>';
    
            }
            table += '</tbody></table>';
            return table;
        }
    
    
        /**************************echarts 公用方法*********************
        *****************************************/
        function TooltipFormatter(data) {
    
            var seriesNames = [];
            var formateStrings = [];
            var formateString = "";
            if (data.length > 0) {
                formateStrings.push(data[0].axisValue);
                for (i in data) {
                    var item = data[i];
                    seriesNames.push(item.seriesName);
                    if (item.value != null) {
                        formateStrings.push(item.marker + item.seriesName + ": " + format45(item.value,1000));
                    }
    
                }
                formateString = formateStrings.join("<br />");
                return formateString;
    
            }
        }
    
        function TooltipFormatterX(data) {
            //console.log('TooltipFormatterX', data);
            var seriesNames = [];
            var formateStrings = [];
            var formateString = "";
            if (data.length > 0) {
                formateStrings.push(data[0].axisValue);
                for (i in data) {
                    var item = data[i];
                    seriesNames.push(item.seriesName);
                    if (item.value != null && item.value.length>0) {
                        formateStrings.push(item.marker + item.seriesName + ": " + format45(item.value[1], 1000));
                    }
    
                }
                formateString = formateStrings.join("<br />");
                return formateString;
    
            }
        }
    

    没有写明的函数:

    根据数组 对象的时间字符串排序(转载)

    https://www.cnblogs.com/hao-1234-1234/p/14269048.html

      

    经验教训:

    这个问题是由数据缺失造成的,所以我开始就去数据库想要建一个新的视图,然后右连接补充一个有类别核心字段为空的行。

    但我发现好几个类别的日期都不全,对数据库函数、产量并不擅长。所以我选择前端造成数据组装。但又有两个方法必须联动。

    其实最简单的方法是服务器端 组装数据!

    去重查询表所有日期

    去重查询表所有类别。

    for 类别[

    for日期[

     根据类别和日期必须数据,有就赋值给对象a,没有就新建对象a. 然后把类别和日期赋值和它,核心字段为空。

    ]

    ]

    这样前端代码不用改,比前端组装数据少改两个方法!

    不要上来就做,而是思考多种技术方案,然后选择最容易的那种。

    如果没有想到方案,要有最优解模式:

    1、有极致的性能要求或能马上解决问题的sql方法,才考虑数据库端。(最后选)

    2、有一定代码量或逻辑的,一定在服务器端解决。(首选)

    3、传输的数据要最小化,带宽太大基本用不完,可以考虑前端组装数据。前端有简单实用的解决案例。前端方案比服务器端方案容易。(第二选)

  • 相关阅读:
    gridview 列排序问题
    asp.net中session丢失原因分析
    网页flash挡住了TQ的解决办法
    php正确率比较高的安装教程
    PHP5+APACHE2.2配置
    HTML5: HTML5 网站设计作品欣赏
    ASP.NET开源CMS汇总
    ASP.NET:页面传值的几种方式
    Access:数据库操作常见错误
    observer pattern
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/14269071.html
Copyright © 2011-2022 走看看