echart 动态折线图实现,及上下波动bug修复

一、echart 动态折线图实现原理等

 1.原理:echart 动态折线图的实现原理,本质就是动态的改变series中data的值。

 2.步骤:

   a.定义一个定时器,间隔指定的时间去触发事件(改变series中data的方法)。

   b.在事件中,要重新定义option,并重新设置。

   c.在事件中,不断的改变series中data的值(建议从前面删除,后面插入的方式)。

  3.注意:

   a.如果chart被封装成了组件,有可能会不成功。建议在单一页面里面操作。

二、官网代码

1.官网代码

function randomData() {
    now = new Date(+now + oneDay);
    value = value + Math.random() * 21 - 10;
    return {
        name: now.toString(),
        value: [
            [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'),
            Math.round(value)
        ]
    };
}

var data = [];
var now = +new Date(1997, 9, 3);
var oneDay = 24 * 3600 * 1000;
var value = Math.random() * 1000;
for (var i = 0; i < 1000; i++) {
    data.push(randomData());
}

option = {
    title: {
        text: '动态数据 + 时间坐标轴'
    },
    tooltip: {
        trigger: 'axis',
        formatter: function (params) {
            params = params[0];
            var date = new Date(params.name);
            return date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear() + ' : ' + params.value[1];
        },
        axisPointer: {
            animation: false
        }
    },
    xAxis: {
        type: 'time',
        splitLine: {
            show: false
        }
    },
    yAxis: {
        type: 'value',
        boundaryGap: [0, '100%'],
        splitLine: {
            show: false
        }
    },
    series: [{
        name: '模拟数据',
        type: 'line',
        showSymbol: false,
        hoverAnimation: false,
        data: data
    }]
};

setInterval(function () {

    for (var i = 0; i < 5; i++) {
        data.shift();
        data.push(randomData());
    }

    myChart.setOption({
        series: [{
            data: data
        }]
    });
}, 1000);

三、效果图(静态)

效果是:折线会往箭头方向移动,左边的消失,右边的进入。

四、入坑的bug

正常情况下,折线图会正常的消失和出现,但是有时候不是那么简单的就成功了。我遇到的问题是折线图在上下跳动。如图:

1.原因分析:

   a.出现问题,总是要百度一下。第一次有点希望的看了这个帖子:https://www.dazhuanlan.com/2020/01/10/5e17f65b727fc/

事出有因,我的数据结构还真就是普通的结构([key,value]),不是官网的对象结构{name:::,value:[key:"",value""]}。高兴的以为能解决问题,改了不少代码。最终。。。结果都懂的。

   b.既然不是数据结构的问题,那么肯定就是别的问题。我把方向转移到了数据的格式上面。因为,不是所有的数据都会跳动,有的数据会,有的数据不会。为什么会出现这种情况呢?还真的不好定位。结果,各种编码集转换,格式处理。然而,结果还是不是很满意,还是没有解决问题。

   c.这样,一个月过去了,心里的石头还是没有放下来。又换了个思维,从出现跳动的数值上面下文章,是不是数值有什么问题,有什么规律呢?看了半天,还是没有看出什么问题来,毕竟不是数学专业的。

  d.时间很快,半个月又过去了。这次从出现跳动的频率上来思考。开始以为是1秒钟一次跳动(定时器不同,会有不同)。然后放慢了速度,发现出现跳动的频率和时间没有关系。问题越来越近了,既然不是时间问题,那就是次数问题啊!果不其然,不管怎么改变定时器的频率,都是“删除/添加”5次数据后就开始跳动一次。问题总算是定位到了,该怎么解决呢?各种尝试后,终于弄出来了。心里的石头也是总算放下来了。

五、bug处理

1.定时器:this.timer = setInterval(this.get, 1000);

  2.get方法

  3.在每次get()方法里面,要先处理5次对series中data的“删除/新增”操作。这5次操作和5次后跳动的关系正好匹配上,就解决问题了。至于为什么会出现这个问题,本人小白一个,希望大神来补充一下。

get()的伪代码如下:

for(var i = 0; i < 5; i++) {

       data.shift();

       data.push(newData);

}

chart.setOption(option);

问题解决了,心里舒服多了!

 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现折线图动态tooltip效果,可以通过以下步骤进行操作: 1. 在echarts中定义一个tooltip组件,然后设置trigger为'axis',显示为true。 2. 定义一个formatter函数,用于设置tooltip的显示内容。可以在formatter函数中获取到当前鼠标所在的位置,然后通过echarts中的API获取到当前位置对应的数据信息。 3. 在图表的series中设置markPoint和markLine,用于在折线图上画出当前鼠标所在位置的点和线。 4. 在图表的option中设置tooltip的extraCssText属性,用于设置tooltip的样式。可以设置样式的颜色、背景色、字体等。 5. 最后,在option中设置animationDuration属性,用于设置动态效果的时间。 下面是一个示例代码: ```javascript option = { tooltip: { trigger: 'axis', show: true, formatter: function (params) { var res = params[0].name; for (var i = 0, l = params.length; i < l; i++) { res += '<br/>' + params[i].seriesName + ' : ' + params[i].value; } return res; }, extraCssText: 'background-color: rgba(0, 0, 0, 0.8); color: #fff; padding: 10px;' }, xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [{ name: 'Sales', type: 'line', data: [120, 200, 150, 80, 70, 110, 130], markPoint: { data: [{ type: 'max', name: '最大值' }, { type: 'min', name: '最小值' }] }, markLine: { data: [{ type: 'average', name: '平均值' }] } }], animationDuration: 1000 }; ``` 以上代码实现折线图动态tooltip效果,通过设置formatter函数和extraCssText属性,可以自定义tooltip的样式和内容。通过设置markPoint和markLine,可以在折线图上画出当前鼠标所在位置的点和线,实现动态效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值