使用echart画折线图的经验_1

本文分享了使用 ECharts 绘制折线图的经验,包括如何增强图表的灵活性以适应不同指标的需求,设置坐标轴刻度以展示数据分布特征,调整坐标轴标签角度和间隔,处理缺失数据及避免 CPU 负载过高导致的渲染失败等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几点经验:
1. 绘制函数一定要扩展性强,以适应多指标多图表绘制。
2. 可以按照中间95%范围的数据样本的值来设置Y轴刻度的最大最小值。最大最小值之外的值点还是会体现在数据中,其标识点则会画在最上或最下的分割线上。
3. axisLabel: {rotate: 45, interval:desc.xVals_intv}可以控制X轴坐标的角度和显示间隔。
4. 折线图不能像scatter一样,以[x,y]方式设置系列的值列表。所以,如果有某值系在某X位置没有值,则其中值可以设置为'-'。此时,折线绘制到此[x,-]位置时,会断掉,形成很多的断裂的线段。
4. echart在CPU很忙的时候,同时进行绘图,很容易导致渲染失败。可以把大规模的数据计算放在绘图前完成。避免绘图与数据处理并行。
//绘图
<script src="<%=path%>/resources/customJS/echarts-all.js"></script>
<script type="text/javascript">
var lineChart=function (desc,filterval) {
    var myChart = echarts.init(document.getElementById(lineDivGet(desc.key)));
    var congesalg = ""
    if (typeof(filterval.congesalg) != "undefined"){
        congesalg = filterval.congesalg;
    }
    var myoption = {
            title : {
                text: desc.seqNum + ". " + lineTitleGet(desc.key)+" ("+filterval.eNetType+" "+
                    congesalg + ")",
                subtext:"计算公式: " + lineSubtitleGet(desc.key),
                subtextStyle: { 
                    fontSize: 14, 
                    color: 'blue' //设置副标题颜色和大小
                },
                x:'center'
            },
            tooltip : {
                show: true,
                trigger: 'axis',
                formatter: function(data){ //鼠标移到某有值点的X轴位置时,提示的信息。
                    var info =  desc.xlabels[data[0].dataIndex];
                    for (var i = 0; i < data.length; i++){//data[i]是值点系列
                        if ("-" != data[i].value){//如果某系列在此X轴位置没有值,则其值为'-'
                            var tmp = data[i].seriesName.split(" ");
                            info += "<br>" + tmp[0]+":" + data[i].value + desc.unit;
                        }
                    }
                    return info;
                }
            },
            legend: {
                orient: 'vertical',
                x:'left',
                data:desc.sName//赋值值点系列名
            },
            toolbox: {
                show: true,
                orient : 'vertical',
                x: 'right',
                y: 'center',
                feature : {
                    mark : {show: true},
                    dataView : {show: true, readOnly: false},
                    restore : {show: true},
                    saveAsImage : {show: true}
                }
            },
            xAxis : [
                     {
                         axisLabel: {rotate: 45, interval:desc.xVals_intv},//设置X坐标标识斜转45度;并设置刻度生成的间隔,以避免刻度太多显示难看
                         type : 'category',
                         splitLine: {show: false},//不显示X轴垂直的分割线
                         boundaryGap : false,
                         data : desc.xVals
                     },
                 ],
                 yAxis : [
                     {
                         type: 'value',
                         min: desc.ymin,
                         max: desc.ymax,
                         splitNumber:desc.gripNum,//设置Y轴值最大最小值,以及分为几个刻度。
                         axisLabel : {
                             formatter: '{value} '+ desc.unit//设置Y轴刻度标识格式
                         }
                     }
                 ],
               series : [
                           {
                               name: desc.sName[0],
                               type: 'line',
                               data: desc.yVals[0],
                               itemStyle:{
                                   emphasis:{label:{show:true}}
                               },
                               markPoint : {//标识出最大最小值
                                   data : [
                                       {type : 'max', name: '最大值'},
                                       {type : 'min', name: '最小值'}
                                   ]
                               },
                               markLine : {
                                   data : [//画平均值线
                                       {type : 'average', name: '平均值'}
                                   ]
                               }

                           },

                           {
                               name: desc.sName[1],
                               type: 'line',
                               data: desc.yVals[1],
                               itemStyle:{
                                   emphasis:{label:{show:true}}
                               },
                               markPoint : {
                                   data : [
                                       {type : 'max', name: '最大值'},
                                       {type : 'min', name: '最小值'}
                                   ]
                               },
                               markLine : {
                                   data : [
                                       {type : 'average', name: '平均值'}
                                   ]
                               }

                           }
            ],

        };
    myChart.setOption(myoption);
}

“`
//计算值点描述信息
var getLineDesc = function(key, items, filterval){
var xlabels = []
var xVals = []
var yVals = []
var yVals_S1 = []
var avg_S1 = 0
var num_S1 = 0
var avg_S2 = 0
var num_S2 = 0
var yVals_S2 = []
var xVals_num = 10

    if (items.length > 0){
        var xVals_intv = Math.ceil(items.length/xVals_num)
        var tag=""
        if (datafilter_nettype_slow == filterval.eNetType){
              tag="2"
        }
        //区分值系列
        for (var i = 0; i < items.length; i++){
            var labelx = items[i].tvSec + "<br>" +
                "Addr:"+items[i].addr +"/"+ items[i].port + "<br>" + 
                "周期:"+items[i].period +"&nbsp;&nbsp;" +" " + items[i].congesalg
            xlabels.push(labelx)
            xVals.push(items[i].tvSec.replace(" ","\n"))
            var yx = Math.floor((items[i][key+tag] * lineAjustGet(key))*100)/100;
            yVals.push(yx);
            if (0 != items[i].optimizing){
                avg_S1 += yx;
                num_S1 ++;
                yVals_S1.push(yx);
                yVals_S2.push("-");
            }else{
                avg_S2 += yx;
                num_S2 ++;
                yVals_S1.push("-");
                yVals_S2.push(yx);
            }

        }
    }

    var optPercent = ""
    var unit = lineUnitGet(key);
    if (num_S1 > 0){
        avg_S1 = Math.floor((avg_S1/num_S1) *100)/100;
    }else{
        avg_S1 = "-"
    }

    if (num_S2 > 0){
        avg_S2 = Math.floor((avg_S2/num_S2) *100)/100;
        if (num_S1 > 0){
            if ('%' == unit){
                optPercent = "(" + Math.ceil((avg_S1 - avg_S2) *100)/100 + "%)";
            }else{
                optPercent = (((avg_S2 - avg_S1)*100)/avg_S2)
                optPercent = "(" + Math.ceil(optPercent *100)/100 + "%)";
            }
        }
    }else{
        avg_S2 = "-"
    }
    //计算Y周最大最小刻度,和设置的分割数
    var defaultYGripNum = 4
    var pickThreshold = 0.025 //use 95% data 2 caculate Y Scale Value
    var ySort = sortArray(yVals);
    var ymax = 0;
    var ymin = 0;
    if (0 != yVals.length) {
        var tag = Math.ceil(ySort.length * pickThreshold)
        ymin = ySort[tag];

        tag = Math.ceil(ySort.length * ( 1 - pickThreshold));
        if (tag >= ySort.length){
            tag = ySort.length - 1;
        }
        ymax = ySort[tag];
        var yIntvl = Math.ceil((ymax - ymin + 1)/(defaultYGripNum - 1))
        ymin = ymin - Math.ceil(yIntvl/2)
        if (ymin < 0){
            ymin = 0;
        }else{
            ymin = Math.floor(ymin)
        }
        ymax = ymax + Math.ceil(yIntvl/2);
        ymax = ymin + Math.ceil((ymax - ymin)/defaultYGripNum)*defaultYGripNum;
    }
    //赋值出去
    var desc = {};
    desc.key = key;
    desc.xVals = xVals;
    desc.xlabels = xlabels;
    desc.xVals_intv = xVals_intv;
    desc.yVals = [yVals_S1, yVals_S2];
    desc.ymax = ymax;
    desc.ymin = ymin;
    desc.unit = unit;
    desc.gripNum = defaultYGripNum;
    desc.sName = [datafilter_optimize_yes +" "+avg_S1+unit + optPercent,
                  datafilter_optimize_no+" "+avg_S2+unit];
    return desc;
}

var allLineChartDo = function(filterval, items){//上层控制函数
if (0 == items.length){
return;
}

    var tag=""
    if (datafilter_nettype_slow == filterval.eNetType){
        tag="2"
    }
    var lineDesc = [];
    var lineNum = 0;
    for (var i = 0; i < linelist_info.length; i++){
        var key = linelist_info[i][LINE_INFO.KEY];
        if (typeof(items[0][key+tag]) != "undefined"){
            var desc = getLineDesc(key, items, filterval);
            desc.seqNum = lineNum + 1;
            lineDesc[lineNum++] = desc;
        }
    }
    for (var i = 0; i < lineDesc.length; i++){
        lineChart(lineDesc[i], filterval)
    }
}

“`

在Vue 3中使用ECharts绘制折线图,你需要先安装ECharts库,并在组件中引入和使用。 首先,使用npm或yarn安装ECharts: ```shell npm install echarts ``` 或 ```shell yarn add echarts ``` 然后,在你的Vue组件中引入ECharts并创建一个折线图的容器: ```javascript <template> <div id="lineChart" style="width: 100%; height: 400px;"></div> </template> <script> import * as echarts from 'echarts'; export default { mounted() { this.renderLineChart(); }, methods: { renderLineChart() { // 基于准备好的dom,初始化echarts实例 const chartDom = document.getElementById('lineChart'); const myChart = echarts.init(chartDom); // 定义折线图的配置项和数据 const option = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { data: [120, 200, 150, 80, 70, 110, 130], type: 'line' } ] }; // 使用刚指定的配置项和数据显示图表 myChart.setOption(option); } } }; </script> ``` 上述代码中,我们首先在`mounted`生命周期钩子函数中调用`renderLineChart`方法。在该方法中,我们通过`echarts.init`方法初始化一个ECharts实例,并传入指定的DOM容器。然后,我们定义了折线图的配置项和数据,其中`xAxis`表示X数据,`yAxis`表示Y数据,`series`表示要绘制的折线图数据。最后,我们使用`myChart.setOption(option)`方法将配置项和数据应用到图表中。 记得在组件销毁时,调用`myChart.dispose()`方法来销毁ECharts实例,避免内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值