Echars统计图的使用
阅读原文时间:2023年07月11日阅读:2

第一步去官网挑选自己需要的图形了。 官网地址:https://echarts.baidu.com/

第二步按照官网的demo,下载需要的js组件并放到自己的项目中。

第三步仿照demo创建需要的div,并在js中将方法原模原样的复制过去,运行测试是否能够在页面显示出来,以此来检查最基本的js组件有木有引对等最不应该犯得小错误。

第四步确定demo在自己的项目中可以正常显示之后,就可以对自己的数据进行处理了。按照demo的数据格式进行拼接,可以通过后台进行拼接,也可以在js中进行拼接。

以下是我个人对于基本的柱形图、饼状图、折线图的使用代码。

因为这是在原来项目上进行修改,而且项目比较老了,不想动后台,直接将后台传输到前台的页面在js中进行处理了。

柱形图:

后台返回到页面的信息如下

¨C13C¨C14C¨C15C¨C16C¨C17C¨C18C¨C19C¨C20C¨C21C¨C22C¨C23C¨C35C¨C36C¨C37C¨C38C¨C39C¨C40C¨C41C¨C42C¨C43C¨C44C¨C45C

jsp代码(片段)

        

js代码(片段)

function show_queryRpt(){
var myChart = echarts.init(document.getElementById("my-tabs-qcq"));
Ext.Ajax.request({
url: './rptController.do',
timeout: '60000',
params:{
method:'newQueryRptSame', //queryRpt
sign : Ext.getCmp('programSignJs').getValue(),
cityCode: deptTpye >1 ? cityCode : Ext.getCmp('rptCityJs').getValue(),
deptId: deptTpye >2 ? deptId : Ext.getCmp('rptDeptJs').getValue() ,
deptName : Ext.getCmp('rptDeptJs').getRawValue() ,
important : Ext.getCmp('importantJs').getValue() ,
inceptObj : Ext.getCmp('inceptObjJs').getValue() ,
startDate : Ext.getCmp('recordStartDateJs1').getValue() ,
endDate : Ext.getCmp('recordEndDateJs1').getValue(),
duration : Ext.getCmp('durationJs').getValue()
},
success : function(resp, option) { //数据处理部分就在这里,ajax返回的data也就是resp进行处理以下栗色部分为数据处理的过程
var res = resp.responseText;
alert(res)
var reg1 = /label='(.*?)'/g;
var reg2 = /value='(\d+)'/g;
var reg3 = /\'.*\'/;
var str1 = res.match(reg1);
var str2 = res.match(reg2);
var arrayObj = new Array();
var arrayVal = new Array();
//alert(str1)
if(!(str1 == null || str1 == "" || str1 == "undefined")){
for (var i = 0;iarrayObj, //重点拼接数据之一 axisLabel : {//坐标轴刻度标签的相关设置。 interval:0, rotate:"30" //x轴倾斜程度 当x轴字符串过长时可以倾斜显示 } //下边注释掉的为将每行显示的字符串进行处理 /*axisLabel : {//坐标轴刻度标签的相关设置。 formatter : function(arrayObj){ var newParamsName = "";// 最终拼接成的字符串 var paramsNameNumber = arrayObj.length;// 实际标签的个数 var provideNumber = 2;// 每行能显示的字的个数 var rowNumber = Math.ceil(paramsNameNumber / provideNumber);// 换行的话,需要显示几行,向上取整 *//** * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签 *//* // 条件等同于rowNumber>1
if (paramsNameNumber > provideNumber) {
*//** 循环每一行,p表示行 *//*
for (var p = 0; p < rowNumber; p++) {
var tempStr = "";// 表示每一次截取的字符串
var start = p * provideNumber;// 开始截取的位置
var end = start + provideNumber;// 结束截取的位置
// 此处特殊处理最后一行的索引值
if (p == rowNumber - 1) {
// 最后一次不换行
tempStr = arrayObj.substring(start, paramsNameNumber);
} else {
// 每一次拼接字符串并换行
tempStr = arrayObj.substring(start, end) + "\n";
}
newParamsName += tempStr;// 最终拼成的字符串
}

                                    } else {  
                                        // 将旧标签的值赋给新标签  
                                        newParamsName = arrayObj;  
                                    }  
                                    //将最终的字符串返回  
                                    return newParamsName  
                        }

                    }\*/  
                },  
                yAxis: {},  
                series: \[{  
                    name: '备案通过节目和栏目',  
                    type: 'bar',  
                    itemStyle: {  
                        normal:{  
                            color:"#4169E1"  
                        }  
                    },  
                    data: **arrayVal //重点拼接数据之二**  
                }\]  
            };  
            // 使用刚指定的配置项和数据显示图表。  
           ** myChart.setOption(option);**  
    }else{  
        alert("暂无数据")  
    }  
    }  
});  

};

饼状图:

后台返回到页面的数据

|11427.842

jsp代码同上

js代码:

var show_tInterval = function() {
var myChart = echarts.init(document.getElementById("chartTime"));
var programCity;
if(cityName == Ext.getCmp('cityTimeJs').getValue()){
programCity = cityCode;
}else{
programCity = Ext.getCmp('cityTimeJs').getValue();
}
var programDept;
if(deptName == Ext.getCmp('deptTimeJs').getValue()){
programDept = deptId;
}else{
programDept = Ext.getCmp('deptTimeJs').getValue();
}
var avgOrSumTime = Ext.getCmp('avgOrSumTimeJs').getValue();
Ext.Ajax.request({
url: './programCountcontroller.do?method=newIteminterval', //newIteminterval
timeout: '60000',
params:{
sign : Ext.getCmp('signTimeJs').getValue(),
cityCode : programCity,
uploadDeptId : programDept,
typeTime : Ext.getCmp('typeTimeJs').getValue(),
avgOrSumTime : avgOrSumTime //Ext.getCmp('avgOrSumTimeJs').getValue()
},
success : function(resp, option) { //进行数据处理,用到了正则匹配。数据一般都是转为json格式。
var res = resp.responseText;
//alert(res)
var reg1 = /name=\s'(.*?)'/g;
var reg2 = /value='(.*?)'/g;
var reg3 = /\'.*\'/;
var str1 = res.match(reg1);
var str2 = res.match(reg2);
var arrayData = new Array();
var str4 = "";
var legenddata = '[';
var seriesdata = '[';
if(!(str1 == null || str1 == "" || str1 == "undefined")){
for (var i = 0;i<str1.length;i++){
//拼接数据 将“=”替换成“:”
var strName = str1[i].toString().replace(/=/g,":");
strName = strName.substring(0,strName.length);
//console.log("strName======"+strName);
legenddata += '"' + strName.match(reg3).toString().replace(/\'/g,"") + '",'
//console.log(str1[i].toString().replace(/=/g,":"));
var str3 = str2[i].toString().replace(/\'/g,"").replace(/=/g,":");
var strNum;
if(str3.indexOf('.') != -1){ //如果是浮点类型的则保留两位小数
strNum = str3.substring(0,str3.indexOf('.')+3);
}else{ //整数直接保留
strNum = str3;
}

            seriesdata += '{"name":"' + strName.match(reg3).toString().replace(/\\'/g,"") + '","value":' + strNum.substring(6,strNum.length) + '},';  
            //console.log(strName);

            //arrayData.push("{"+strNum+","+strName+"}");  
        }  
         if (legenddata.length > 1) {  
             legenddata = legenddata.substring(0, legenddata.length - 1);  
         }  
         if (seriesdata.length > 1) {  
             seriesdata = seriesdata.substring(0, seriesdata.length - 1);  
         }  
        legenddata += '\]';  
        seriesdata += '\]';

        var arr1 = res.split('|')\[0\];  
        var arr2 = res.split('|')\[1\];  
        var caption = '类型平均时长统计';  
        if(avgOrSumTime == 1){  
         caption = '类型总时长统计';  
        }else if(avgOrSumTime == 2){  
             caption = '节目总备案时长';  
        }else if(avgOrSumTime == 3){  
             caption = '栏目总备案时长';  
        }else if(avgOrSumTime == 4){  
             caption = '全部总备案时长';  
        }  
        option = {  
                title : {  
                    text: '类型总时长统计',  
                    subtext: '',  
                    x:'center'  
                },  
                tooltip : {  
                    trigger: 'item',  
                    formatter: "{a} <br/>{b} : {c} ({d}%)"  
                },  
                legend: {  
                    orient: 'vertical',  
                    left: 'left',  
                    data: $.parseJSON(legenddata)  //需要重点拼接的数据之一  
                },  
                series : \[  
                    {  
                        name: '数据来源',  
                        type: 'pie',  
                        radius : '55%',  
                        center: \['50%', '60%'\],  
                        data: $.parseJSON(seriesdata),  //需要重点拼接的数据之二  
                        itemStyle: {  
                            emphasis: {  
                                shadowBlur: 10,  
                                shadowOffsetX: 0,  
                                shadowColor: 'rgba(0, 0, 0, 0.5)'  
                            }  
                        }  
                    }  
                \]  
            };  
         myChart.setOption(option);  
    }else{  
        alert("暂无数据")  
    }  
    }  
});  

};

折线图:

后台返回页面数据(片段):

¨C76C¨C77C¨C78C¨C79C¨C80C¨C81C¨C82C¨C83C¨C84C¨C85C¨C86C¨C87C¨C88C¨C89C¨C90C¨C91C¨C92C¨C93C¨C94C¨C95C¨C96C¨C97C¨C98C¨C99C¨C100C¨C101C¨C102C¨C103C¨C104C¨C105C <set …

jsp同第一个

js代码:

var show_Drift = function() {
var city;
var chartDirft = echarts.init(document.getElementById("chartDirft"));
if(cityName == Ext.getCmp('cityDriftJs').getValue()){
city = cityCode;
}else{
city = Ext.getCmp('cityDriftJs').getValue();
}
var dept;
if(deptName == Ext.getCmp('deptDriftJs').getValue()){
dept = deptId;
}else{
dept = Ext.getCmp('deptDriftJs').getValue();
}
Ext.Ajax.request({
url: './programCountcontroller.do',
timeout: '60000',
params:{
method:'newStaticChange',
// method:'staticChange',
sign : Ext.getCmp('signDriftJs').getValue(),
city:city,
dept:dept,
timeType:Ext.getCmp('timeTypeJs').getValue(),
year:Ext.getCmp('yearJs').getValue(),
yearType:Ext.getCmp('yearTypeJs').getValue(),
quarterType:Ext.getCmp('quarterTypeJs').getValue(),
monthType:Ext.getCmp('monthTypeJs').getValue()
},
success : function(resp, option) {
var res = resp.responseText;
//alert(res)
var reg1 = /label='(.*?)'/g;
var reg2 = /value='(\d+)'/g;
var reg3 = /\'.*\'/;
var str1 = res.match(reg1);
var str2 = res.match(reg2);
var arrayObj = new Array();
var arrayVal = new Array();
if(!(str1 == null || str1 == "" || str1 == "undefined")){
for (var i = 0;i<str1.length;i++){
arrayObj.push(str1[i].match(reg3).toString().replace(/\'/g,""));
arrayVal.push(str2[i].match(reg3).toString().replace(/\'/g,""));
}
option = {
xAxis: {
type: 'category',
data: arrayObj, //重点数据一
axisLabel : {//坐标轴刻度标签的相关设置。
interval:0,
rotate:"45" //x轴倾斜程度 当x轴字符串过长时可以倾斜显示
}
},
yAxis: {
type: 'value'
},
series: [{
data: arrayVal, //重点数据二
type: 'line',
itemStyle : { normal: {label : {show: true}}}
}]
};
chartDirft.setOption(option);
}else{
alert("暂无数据")
}
}
});
} ;

最终总结一下,统计图无非就是按照官网上demo中的数据格式进行拼接,然后就是对数据进行处理,处理过程中一定要小心,会出现各种情况。

举个栗子(使用时出现的问题):

1、数据格式明明拼对了,直接拿出来放在官网上进行测试也没问题,把数据直接放在规定的地方也没问题,但是只要是把它放在一个对象里,再放到规定位置就不行出不来,在组件引对的情况下可能是数据不是json格式,需要将数据json处理一下。

2、上面的饼图的代码,对浮点类型的数据进行了处理,但是没想到出现了一个整数,导致数据不完整,无法进行json转换,最后图也出不来。

3、有时候数据可能太大或者字符串太长都可以进行处理,例子中均有处理,也可以在网上进行搜索。