『概览数据整体,按需关注数据细节』是数据可视化的基本交互需求。为此从 2.2.0 版本开始,我们为 G2 加入了框选事件支持

语法使用

默认框选的功能是关闭的,通过调用如何方式开启和关闭:

chart.setMode('select'); // 开启框选模式
chart.setMode(false); // 关闭

目前我们提供了如下三种框选交互形式:

chart.select('rangeX'); // 使用 X 轴范围的框选
chart.selcet('rangeY'); // 使用 Y 轴范围的框选
chart.select('rangeXY'); // 使用 X 和 Y 轴的框选

框选事件

同框选相关的事件如下:

// 框选开始
chart.on('rangeselectstart', function(ev) {
  console.log(ev);
});
// 框选结束
chart.on('rangeselectend', function(ev) {
  console.log(ev);
});
// 双击事件,通常用于将图表恢复至原始状态
chart.on('plotdbclick', function(ev) {
  console.log(ev);
});

rangeselectend 事件返回的参数中有一个属性名为 selected 的参数,其格式如下:

// ev.selected: 被选择区域对应的维度即值范围,格式如下:
{
  dimX: [min, max], // 当 dimX 值对应为连续数据时,返回值区间
  dimY: [yValue1, yValue2, ... , yValueN] // 当 dimY 值对应为分类数据时,返回值
}

框选示例

下面通过具体的实例来展示框选的效果。

注意:下面例子中只定义了 X 轴的框选效果,当鼠标双击时,图表恢复至原始状态。

$.getJSON('../static/data/avg-temp.json', function(data) {
  var Frame = G2.Frame;
  var frame = new Frame(data);
  frame = Frame.combinColumns(frame, ['New York', 'San Francisco', 'Austin'], 'value', 'city', 'date');
  var chart = new G2.Chart({
    id: 'c1',
    width: 800,
    height: 400,
    plotCfg: {
      margin: [60, 30, 30]
    }
  });
  chart.setMode('select'); // 开启框选模式
  chart.select('rangeX'); // 选择框选交互形式
  chart.source(frame, {
    date: {
      type: 'time'
    },
    value: {
      alias: 'Temperature, ºF'
    }
  });
  chart.legend({
    position: 'top'
  });
  chart.axis('date', {
    line: {
      stroke: '#000'
    },
    tickLine: {
      stroke: '#000',
      value: 6 // 刻度线长度
    },
    title: null,
    labels: {
      label: {
        textAlign: 'start'
      }
    }
  });
  chart.axis('value', {
    title: null,
    tickLine: {
      stroke: '#000',
      value: 6 // 刻度线长度
    },
    labels: {
      label: {
        fill: '#000'
      }
    },
    line: {
      stroke: '#000'
    },
    grid: null
  });
  chart.line().position('date*value').color('city', ['#1f77b4', '#ff7f0e', '#2ca02c']).shape('spline').size(2);
  chart.render();

  // 监听双击事件,这里用于复原图表
  chart.on('plotdbclick', function(ev) {
    chart.set('filters', {});
    chart.repaint();
  });
});