数据可视化那些事-echarts之brush区域选择

9,720 阅读2分钟

需求描述

接到需求在一个xAxis坐标轴为time类型,series的type类型为line的可视化图表上,用brush圈选出图表上的任何一段数据,然后根据不用数据做出不同的操作。本来以为很简单调一下方法,去翻文档的时候发现:

1、不支持line

2、不支持xAxis坐标轴为time时间轴(不用的轴的区别这里不多赘述)

难搞哦!

简单配置

首先先走官网下载一个例子

官网链接:echarts.apache.org/examples/zh…

启动brush也有两种方案:

1、通过toolbox指定按钮。(详情参加brush.toolbox

 brush: {  
      xAxisIndex: 'all',//指定哪些 series 可以被刷选
      throttleType: "debounce", //开启选中延迟后调用回调延迟 
      throttleDelay: 600, //选中延迟后调用回调延迟时
      brushStyle: {                  
         borderWidth: 1,                    
         color: 'rgba(120,140,180,0.3)',                    
         borderColor: 'rgba(0,0,0,.65)'  
       }            
  },            
  toolbox: {                
    show: true, //可以设置不同的按钮           
  },

2、通过调用 dispatchAction 来用程序主动渲染选框

Chart是当前图表的实例。

根据需求我用的这一种方式。

Chart.dispatchAction({
      type: 'takeGlobalCursor',
      // 如果想变为“可刷选状态”,必须设置。不设置则会关闭“可刷选状态”。
      key: 'brush',
      brushOption: {
           // 参见 brush 组件的 brushType。如果设置为 false 则关闭“可刷选状态”。
           brushType: 'lineX',                    
           // 参见 brush 组件的 brushMode。如果不设置,则取 brush 组件的 brushMode 设置
           brushMode: 'single'              
       }            
     });            
myChart.on('brushEnd', renderBrushed); //圈选结束后的回调

xAxis坐标轴为time类型和其他类型

1、xAxis坐标轴type为time(时间轴)返回的坐标系单位?

2、xAxis坐标轴type为category(类目轴),根据返回的下标去option里得series查找数据

series的type类型为line类型和其他类型

1、bar类型使用brushselected方法返回dataIndex下标去查找数据

2、line类型,返回的是空。文档也有说明不支持line。

解决方案

思路:brush之后会返回圈选矩形的left和top,刷子的矩形范围可以取的到,那再去取每个点的坐标,然后判断每个点是否在这个矩形里面,这样就可以获取到圈选了哪些数据!但是并没有返回每个点的left和top,最后在图表的自身实例上找到了

废话少说,贴代码

function renderBrushed(params) { 
    if (params.areas.length != 0) {
        let p = {}; // 矩形范围
        p.left = params.areas[0].range[0];
        p.right = params.areas[0].range[1];
        let arr = myChart._chartsViews[0]._points.map(([left], i) => left >= p.left && left <= p.right ? i : -1).filter(i => i >= 0);
       //获取不同维度的数据
       console.log(arr.map(i => ([...option.series.map(s => s.data[i])])))               
       console.log(option.series.map(s => ([...arr.map(i => s.data[i])])))
    };
}

两种维度的数据获取方式,完美解决!

结尾

写的不好或者其他解决方案的欢迎交流、指点!

战胜困难的最好办法就是面对困难,加油,奥利给!