几何标记 geom 的选中

注意:选中模式配置属性 selectedMode, 在 [email protected] 及以上 已改为 mode,2.3.0 以下版本请使用 selectedMode

各个几何标记 geom 选中的模式包含如下三种:

  • 不可选中;
  • 单选;
  • 多选。选中模式的设置方式如下(在 geom 对象上添加了 selected() 方法):
  1. // 开启选中模式并设置模式以及选中样式,其中 true 可省略
  2. chart.polygon().position('x*y').selected(true, {
  3. mode: 'multiple' || 'single' || false, // [email protected] 及以上使用 `mode`,2.3.0 以下版本请使用 `selectedMode`
  4. style: {
  5. // 设置选中图形的样式,如不设置则使用默认的样式
  6. }
  7. });
  8. // 关闭选中模式
  9. chart.polygon().position('x*y').selected(false); // 关闭方式 1
  10. chart.polygon().position('x*y').selected({
  11. mode: false // [email protected] 及以上使用 `mode`,2.3.0 以下版本请使用 `selectedMode`
  12. }); // 关闭方式 2

默认情况下,G2 中只有饼图支持选中交互,其他 geom 的选中模式默认情况下都是关闭的。

下面通过两个实例来演示选中 selected(enable, cfg) 方法的使用。

示例:地图省市下钻

本例中的地图 GeoJSON 数据请访问该地址获取:

  1. <script src="https://a.alipayobjects.com/g/datavis/china-geojson/1.0.0/index.js"></script>

或者 github

  1. function processData(mapData) {
  2. var result = [];
  3. var features = mapData.features;
  4. for (var i = 0; i < features.length; i++) {
  5. var name = features[i].properties.name;
  6. result.push({
  7. "name": name,
  8. "value": Math.round(Math.random() * 1000)
  9. });
  10. }
  11. return result;
  12. }
  13. function renderProvinceChart(provinceChart, name) {
  14. var provinceData = ChinaGeoJSON[name];
  15. provinceChart.clear();
  16. provinceChart.source(processData(provinceData));
  17. provinceChart.polygon().position(Stat.map.region('name', provinceData))
  18. .label('name', {
  19. label: {
  20. fill: '#333'
  21. }
  22. })
  23. .style({
  24. stroke: '#fff',
  25. lineWidth: 1
  26. })
  27. .color('value', '#e5f5e0-#31a354');
  28. provinceChart.render();
  29. }
  30. var Stat = G2.Stat;
  31. var mapData = ChinaGeoJSON['China'];
  32. var chart = new G2.Chart({
  33. id: 'china',
  34. width: 250,
  35. height: 180,
  36. plotCfg: {
  37. margin: [0, 10]
  38. }
  39. });
  40. chart.source(processData(mapData));
  41. chart.tooltip({
  42. title: null
  43. });
  44. chart.polygon().position(Stat.map.region('name', mapData)).tooltip('name')
  45. .style({
  46. stroke: '#999',
  47. lineWidth: 1,
  48. fill: '#ccc',
  49. globalAlpha: 0.9,
  50. cursor: 'pointer' // 设置鼠标手势
  51. }).selected({ // 设置是否允许选中以及选中样式
  52. mode: 'single', // 多选还是单选, [email protected] 及以上使用 `mode`,2.3.0 以下版本请使用 `selectedMode`
  53. style: {
  54. fill: '#fe9929' // 选中的样式
  55. }
  56. });
  57. chart.render();
  58. var provinceChart = new G2.Chart({
  59. id: 'province',
  60. width: 600,
  61. height: 500,
  62. plotCfg: {
  63. margin: [20, 80, 40, 40]
  64. }
  65. });
  66. var shapeData = chart.getAllGeoms()[0].getData();
  67. for (var i = 0, len = shapeData.length; i < len; i++) {
  68. var item = shapeData[i];
  69. var origin = item['_origin'];
  70. var name = origin.name;
  71. if (name === '浙江') {
  72. renderProvinceChart(provinceChart, name);
  73. chart.getAllGeoms()[0].setSelected(item);
  74. }
  75. }
  76. chart.on('plotclick', function(ev) {
  77. var shape = ev.shape;
  78. if (shape && shape.get('selected')) {
  79. var item = shape.get('origin');
  80. var data = item['_origin'];
  81. var name = data.name;
  82. renderProvinceChart(provinceChart, name);
  83. } else {
  84. provinceChart.clear();
  85. }
  86. });

图表框选交互

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

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

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

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

框选事件

同框选相关的事件如下:

  1. // 框选开始
  2. chart.on('rangeselectstart', function(ev) {
  3. console.log(ev);
  4. });
  5. // 框选结束
  6. chart.on('rangeselectend', function(ev) {
  7. console.log(ev);
  8. });
  9. // 双击事件,通常用于将图表恢复至原始状态
  10. chart.on('plotdblclick', function(ev) {
  11. console.log(ev);
  12. });

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

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

框选示例

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

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

  1. $.getJSON('../../../../../static/data/avg-temp.json', function(data) {
  2. var Frame = G2.Frame;
  3. var frame = new Frame(data);
  4. frame = Frame.combinColumns(frame, ['New York', 'San Francisco', 'Austin'], 'value', 'city', 'date');
  5. var chart = new G2.Chart({
  6. id: 'c1',
  7. width: 800,
  8. height: 400,
  9. plotCfg: {
  10. margin: [60, 30, 30]
  11. }
  12. });
  13. chart.setMode('select'); // 开启框选模式
  14. chart.select('rangeX'); // 选择框选交互形式
  15. chart.source(frame, {
  16. date: {
  17. type: 'time'
  18. },
  19. value: {
  20. alias: 'Temperature, ºF'
  21. }
  22. });
  23. chart.legend({
  24. position: 'top'
  25. });
  26. chart.axis('date', {
  27. line: {
  28. stroke: '#000'
  29. },
  30. tickLine: {
  31. stroke: '#000',
  32. value: 6 // 刻度线长度
  33. },
  34. title: null,
  35. labels: {
  36. label: {
  37. textAlign: 'start'
  38. }
  39. }
  40. });
  41. chart.axis('value', {
  42. title: null,
  43. tickLine: {
  44. stroke: '#000',
  45. value: 6 // 刻度线长度
  46. },
  47. labels: {
  48. label: {
  49. fill: '#000'
  50. }
  51. },
  52. line: {
  53. stroke: '#000'
  54. },
  55. grid: null
  56. });
  57. chart.line().position('date*value').color('city', ['#1f77b4', '#ff7f0e', '#2ca02c']).shape('spline').size(2);
  58. chart.render();
  59. // 监听双击事件,这里用于复原图表
  60. chart.on('plotdblclick', function(ev) {
  61. chart.get('options').filters = {};
  62. chart.repaint();
  63. });
  64. });