[TOC]
- 图表交互激活选中示例:地图省市下钻
图表交互
G2 默认内置的交互包括:
- active 激活;
- select 选中。
激活
开启以及关闭 shape 对于鼠标 hover 时的响应效果,G2 默认为各个 shape 内置了 active 效果。
geom.active(false); // 关闭默认响应geom.active(true); // 开启默认响应
选中
各个几何标记 geom 选中的模式包含如下三种:
- 不可选中;
- 单选;
- 多选;
- 选中是否可取消选中。选中模式的设置方式如下:
geom.select(false); // 关闭geom.select(true); // 打开geom.select([true,] { mode: 'single' || 'multiple', // 选中模式,单选、多选 style: {}, // 选中后 shape 的样式 cancelable: true | false, // 选中之后是否允许取消选中,默认允许取消选中 animate: true | false // 选中是否执行动画,默认执行动画});
默认情况下,G2 中只有饼图支持选中交互,其他 geom 的选中模式默认情况下都是关闭的。
下面通过一个实例来演示选中 select(enable, cfg) 方法的使用。
示例:地图省市下钻
本例中的地图 GeoJSON 数据请访问该地址获取:
<script src="https://a.alipayobjects.com/g/datavis/china-geojson/1.0.0/index.js"></script>
或者 github。
let provinceChart; function processData(mapData) { // 构造虚拟数据 const userData = []; const features = mapData.features; for (let i = 0; i < features.length; i++) { const name = features[i].properties.name; userData.push({ name: name, value: Math.round(Math.random() * 1000), }); } const ds = new DataSet(); const geoDataView = ds.createView().source(mapData, { type: 'GeoJSON', }); // geoJSON 经纬度数据 // 用户数据 const dvData = ds.createView().source(userData); dvData.transform({ type: 'geo.region', field: 'name', geoDataView: geoDataView, as: ['longitude', 'lantitude'], }); return dvData; } function renderProvinceChart(name) { const provinceData = ChinaGeoJSON[name]; provinceChart && provinceChart.destroy(); provinceChart = null; if (!provinceData) { return; } const dv = processData(provinceData); // start: 计算地图的最佳宽高 const longitudeRange = dv.range('longitude'); const lantitudeRange = dv.range('lantitude'); const ratio = (longitudeRange[1] - longitudeRange[0]) / (lantitudeRange[1] - lantitudeRange[0]); let width; let height; if (ratio > 1) { width = 450; height = width / ratio; } else { width = 350 * ratio; height = 350; } // end: 计算地图的最佳宽高 provinceChart = new G2.Chart({ container: 'province', width, height, padding: 0 }); provinceChart.source(dv); provinceChart.axis(false); provinceChart.tooltip({ showTitle: false, }); provinceChart .polygon() .position('longitude*lantitude') .label('name', { textStyle: { fill: '#fff', fontSize: 10, shadowBlur: 2, shadowColor: 'rgba(0, 0, 0, .45)' }, }) .style({ stroke: '#fff', lineWidth: 1, }) .color('value', '#BAE7FF-#1890FF-#0050B3'); provinceChart.render(); } const mapData = ChinaGeoJSON['China']; const chinaDv = processData(mapData); const longitudeRange = chinaDv.range('longitude'); const lantitudeRange = chinaDv.range('lantitude'); const ratio = (longitudeRange[1] - longitudeRange[0]) / (lantitudeRange[1] - lantitudeRange[0]); const chart = new G2.Chart({ container: 'china', width: 250, height: 250 / ratio, padding: 0, animate: false }); chart.source(chinaDv); chart.tooltip({ showTitle: false, }); chart.axis(false); chart .polygon() .position('longitude*lantitude') .tooltip('name') .style({ stroke: '#bfbfbf', lineWidth: 1, fill: '#e3e3e3', globalAlpha: 0.85, cursor: 'pointer', // 设置鼠标手势 }) .select({ // 设置是否允许选中以及选中样式 mode: 'single', // 多选还是单选 style: { fill: '#1890ff', // 选中的样式 }, }); chart.render(); const shapes = chart.getAllGeoms()[0].getShapes(); for (let i = 0, len = shapes.length; i < len; i++) { const shape = shapes[i]; const origin = shape.get('origin')['_origin']; const name = origin.name; if (name === '浙江') { renderProvinceChart(name); chart.getAllGeoms()[0].setShapeSelected(shape); } } chart.on('plotclick', function(ev) { const shape = ev.shape; if (!shape || !shape.name) { return false; } if (shape.get('selected')) { const item = shape.get('origin'); const data = item['_origin']; const name = data.name; renderProvinceChart(name); } else { provinceChart && provinceChart.clear(); } });
Event 图表事件 Slider 数据滑动条
原文: https://antv.alipay.com/zh-cn/g2/3.x/tutorial/interaction.html
