【可视化】echarts折线图缩放和平移

5,366 阅读5分钟

背景

场景是一个任务的完整执行后需要展示速度和时间曲线,当时间宽度很长时,数据点其实是很多的。这个时候就需要缩放了。
我一开始以为echarts不能做,后来一看还是有api的。很方便。

代码实现

先上代码。 这是完成的一个vue组件,可以直接用的那种。
可缩放的核心是dataZoom。


<template>
  <div :id="id" style="flex: 1;width: 100%;height:auto;min-height:400px" />
</template>

<script>
import { getFormatTime } from '@/utils'
export default {
  props: {
    id: {
      type: String,
      default: 'scrollLine'
    },
    lineData: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      newData: []
    }
  },
  watch: {
    lineData(val) {
      this.newData = val
      this.initChart()
    }
  },
  mounted() {
    // this.initChart()
  },
  methods: {
    initChart() {
      // 基于准备好的dom,初始化echarts实例
      // eslint-disable-next-line no-undef
      var myChart = echarts.init(document.getElementById(this.id))

      // data
      const Ydata = []
      const Y2data = []
      const Xdata = []
      for (const item of this.newData) {
        Xdata.push(getFormatTime(item.reportTs))
        Ydata.push(item.linearSpeedXY)
        Y2data.push(item.linearAccelerationXY)
      }
      // // mock
      // for (let i = 0; i < 1000; i++) {
      //   Xdata.push(i)
      //   Ydata.push(i)
      // }
      // 指定图表的配置项和数据
      var option = {
        title: {
          text: '速度、加速度的时间变化曲线'
        },
        xAxis: {
          type: 'category',
          data: Xdata
        },
        yAxis: {
          type: 'value'
        },
        legend: {
          data: ['速度-时间', '加速度-时间']
        },
        series: [{
          name: '速度-时间',
          data: Ydata,
          type: 'line',
          showSymbol: false,
          smooth: true
        }, {
          name: '加速度-时间',
          data: Y2data,
          type: 'line',
          showSymbol: false,
          smooth: true
        }],
        dataZoom: [
          {
            id: 'dataZoomX',
            type: 'inside',
            xAxisIndex: [0],
            minSpan: 10
            // filterMode: 'none'
          }
        ]
      }
      console.log(option, '55555')

      // 使用刚指定的配置项和数据显示图表。
      myChart.setOption(option)
    }
  }
}
</script>

dataZoom

dataZoom的type有silder和inside两种。配置项类似。
具体可以查看echarts文档。echarts.apache.org/zh/option.h… 我结合两个例子注释一下。

inside:


{
    id: 'dataZoomY',
    type: 'inside',
    filterMode: 'empty',
    disabled:false,                         //是否停止组件的功能。
    xAxisIndex:0,                           //设置 dataZoom-inside 组件控制的 x轴,可以用数组表示多个轴
    yAxisIndex:[0,2],                       //设置 dataZoom-inside 组件控制的 y轴,可以用数组表示多个轴
    radiusAxisIndex:3,                      //设置 dataZoom-inside 组件控制的 radius 轴,可以用数组表示多个轴
    angleAxisIndex:[0,2],                   //设置 dataZoom-inside 组件控制的 angle 轴,可以用数组表示多个轴
    start: 30,                               //数据窗口范围的起始百分比,表示30%
    end: 70,                                  //数据窗口范围的结束百分比,表示70%
    startValue:10,                           //数据窗口范围的起始数值
    endValue:100,                            //数据窗口范围的结束数值。
    orient:"horizontal",                    //布局方式是横还是竖。不仅是布局方式,对于直角坐标系而言,也决定了,缺省情况控制横向数轴还是纵向数轴。'horizontal':水平。'vertical':竖直。
    zoomLock:false,                          //是否锁定选择区域(或叫做数据窗口)的大小。如果设置为 true 则锁定选择区域的大小,也就是说,只能平移,不能缩放。
    throttle:100,                             //设置触发视图刷新的频率。单位为毫秒(ms)。
    zoomOnMouseWheel:true,                   //如何触发缩放。可选值为:true:表示不按任何功能键,鼠标滚轮能触发缩放。false:表示鼠标滚轮不能触发缩放。'shift':表示按住 shift 和鼠标滚轮能触发缩放。'ctrl':表示按住 ctrl 和鼠标滚轮能触发缩放。'alt':表示按住 alt 和鼠标滚轮能触发缩放。
    moveOnMouseMove:true,                    //如何触发数据窗口平移。true:表示不按任何功能键,鼠标移动能触发数据窗口平移。false:表示鼠标滚轮不能触发缩放。'shift':表示按住 shift 和鼠标移动能触发数据窗口平移。'ctrl':表示按住 ctrl 和鼠标移动能触发数据窗口平移。'alt':表示按住 alt 和鼠标移动能触发数据窗口平移。
}

slider:


 {
        id: 'dataZoomX',
        show:true,                              //是否显示 组件。如果设置为 false,不会显示,但是数据过滤的功能还存在。
        backgroundColor:"rgba(47,69,84,0)",  //组件的背景颜色
        type: 'slider',                         //slider表示有滑动块的,inside表示内置的
        dataBackground:{                        //数据阴影的样式。
            lineStyle:mylineStyle,              //阴影的线条样式
            areaStyle:myareaStyle,              //阴影的填充样式
        },
        fillerColor:"rgba(167,183,204,0.4)",  //选中范围的填充颜色。
        borderColor:"#ddd",                     //边框颜色。
        filterMode: 'filter',                   //'filter':当前数据窗口外的数据,被 过滤掉。即 会 影响其他轴的数据范围。每个数据项,只要有一个维度在数据窗口外,整个数据项就会被过滤掉。
                                                  //'weakFilter':当前数据窗口外的数据,被 过滤掉。即 会 影响其他轴的数据范围。每个数据项,只有当全部维度都在数据窗口同侧外部,整个数据项才会被过滤掉。
                                                  //'empty':当前数据窗口外的数据,被 设置为空。即 不会 影响其他轴的数据范围。
                                                  //'none': 不过滤数据,只改变数轴范围。
        xAxisIndex:0,                            //设置 dataZoom-inside 组件控制的 x轴,可以用数组表示多个轴
        yAxisIndex:[0,2],                        //设置 dataZoom-inside 组件控制的 y轴,可以用数组表示多个轴
        radiusAxisIndex:3,                       //设置 dataZoom-inside 组件控制的 radius 轴,可以用数组表示多个轴
        angleAxisIndex:[0,2],                    //设置 dataZoom-inside 组件控制的 angle 轴,可以用数组表示多个轴
        start: 30,                                //数据窗口范围的起始百分比,表示30%
        end: 70,                                  //数据窗口范围的结束百分比,表示70%
        startValue:10,                           //数据窗口范围的起始数值
        endValue:100,                            //数据窗口范围的结束数值。
        orient:"horizontal",                    //布局方式是横还是竖。不仅是布局方式,对于直角坐标系而言,也决定了,缺省情况控制横向数轴还是纵向数轴。'horizontal':水平。'vertical':竖直。
        zoomLock:false,                          //是否锁定选择区域(或叫做数据窗口)的大小。如果设置为 true 则锁定选择区域的大小,也就是说,只能平移,不能缩放。
        throttle:100,                             //设置触发视图刷新的频率。单位为毫秒(ms)。
        zoomOnMouseWheel:true,                  //如何触发缩放。可选值为:true:表示不按任何功能键,鼠标滚轮能触发缩放。false:表示鼠标滚轮不能触发缩放。'shift':表示按住 shift 和鼠标滚轮能触发缩放。'ctrl':表示按住 ctrl 和鼠标滚轮能触发缩放。'alt':表示按住 alt 和鼠标滚轮能触发缩放。
        moveOnMouseMove:true,                   //如何触发数据窗口平移。true:表示不按任何功能键,鼠标移动能触发数据窗口平移。false:表示鼠标滚轮不能触发缩放。'shift':表示按住 shift 和鼠标移动能触发数据窗口平移。'ctrl':表示按住 ctrl 和鼠标移动能触发数据窗口平移。'alt':表示按住 alt 和鼠标移动能触发数据窗口平移。
        left:"center",                           //组件离容器左侧的距离,'left', 'center', 'right','20%'
        top:"top",                                //组件离容器上侧的距离,'top', 'middle', 'bottom','20%'
        right:"auto",                             //组件离容器右侧的距离,'20%'
        bottom:"auto",                            //组件离容器下侧的距离,'20%'

    },

当然,涂省事就不用配置,都采用默认选项就可以了。

数据问题

回过来。 echarts中虽然可以filterMode进行过滤,但是一开始比如就加载10000个点肯定也是会造成性能影响的。最主要的问题是我不知道是100个点还是10万个点,都有可能存在。
所以我在传入这个组件的lineData获取的时候做了处理。按最多1000个点做处理。如果大于1000个点,按一定比例进行采用。这样可以得到0~1000个点采样后的数据,可控。
nice