小知识:Echarts 实现动态图表

1,377 阅读3分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

起因是需要做一个展示数据分析的动态图表,原本的计划是打算使用superset,但是感觉稍微麻烦了点,最后考虑使用简单的图表库echarts来做。

我们简单的使用一下,就不考虑在框架中使用了,而是直接在html中使用。

首先是通过cdn引入。

<script src="https://cdn.jsdelivr.net/npm/echarts@5.2.1/dist/echarts.min.js"></script>

echarts的使用我个人感觉和react的使用有点像。

首先我们需要有一个显示图表的节点, 不过与react不同echarts要使用的节点需要有宽度和高度 ,不过并非一定要在创建节点时指定,后续初始化时 也可以指定。

<div id="container" style="width: 50%;height:50%;"></div>

为了使用图表我们需要初始化一个对象,像下面这样

let container = echarts.init(document.getElementById('container'));

然后在这个对象身上我们的setOption函数将会被用来设置相应的参数以显示图表。

首先我们使用一个最简单的折线图:

        let x = [1, 2, 3, 5, 6, 7, 8, 9,10,11,12]
        let y = [120, 200, 150, 120, 200, 150, 120, 200, 150,120, 200, 210]
        let option = {
            legend: {
                data: ['成交量'],
                icon: 'rect',
                show: true
            },
            xAxis: {
                type: 'category',
                data: x,
                boundaryGap: false,
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    name: '成交量',
                    data: y,
                    type: 'line',
                    smooth: true,
  
                }
            ],
        };

其中legend用于设置图例,图例如果要正确显示则data的值与后续设置的数据的name要完全一致,否则不能显示。xAxis设置x轴的相关数据,boundaryGap设置则是为了我们后面修改x轴的值的时候,仍然从x轴开始,而不是空出一大截。

然后我们在series中设置我们的要展示的y轴数据 data字段,基本上都属于一些样式相关的,这里做模拟,姑且只使用一个数据,不设置多个了。

为了让数据在网页中显示出来,我们只需要使用先前创建的那个container对象调用 container.setOption(option)

网页中就可以显示出我们的折线图了。

接下来是我们要把它改造成动态的。echarts设计的setOption本身是可以多次调用的,当我们设置了新的数据之后,他会自动完成图的更新。而且更重要的是,echarts会自动在变更中间加入过渡的动画,而不是生硬的更新。

我们用随机数来假装有数据的更新,并且每次把x轴往后推进一位,然后我们设置一个定时更新。

        const randomRange = (lower, upper) => { //生成范围内的随机整数
            return Math.floor(Math.random() * (upper - lower)) + lower;
        }
        setInterval(() => {
            x = [...(x.slice(1, x.length)), x[x.length - 1] + 1]
            y = [...(y.slice(1, y.length)), y[y.length - 1] + randomRange(-50, 100)]
            //以最后的值为基础随机增减模拟更新操作
            option.xAxis.data = x
            option.series[0].data = y
            container.setOption(option)
        }, 1000);

最终我们可以获得一个动态更新的图表,整体还是比较简单易于操作的。