Loading...
The elementSelect interaction targets chart elements. When clicking an element, that element will be selected.
Trigger: Click element.
End: Click the selected element again.
Affected states:
Selected elements change to selected state.
Other elements change to unselected state.
Built-in interaction states:
({// Selected state elements have 1px black borderstate: { selected: { lineWidth: '1', stroke: '#000' } },});
The interaction supports two modes:
single: true, only one element can be selected at a time
import { Chart } from '@antv/g2';const chart = new Chart({ container: 'container' });chart.options({type: 'interval',data: {type: 'fetch',value:'https://gw.alipayobjects.com/os/bmw-prod/fb9db6b7-23a5-4c23-bbef-c54a55fee580.csv',},encode: { x: 'letter', y: 'frequency' },state: { selected: { fill: 'orange' }, unselected: { opacity: 0.5 } },axis: { y: { labelFormatter: '.0%' } },interaction: { elementSelect: true },});chart.render();
There are two ways to configure the elementSelect interaction:
First, pass a boolean to set whether to enable the interaction.
({type: 'interval',interaction: { elementSelect: true }, // Use default configuration});
Second, pass configuration options to configure the interaction.
({type: 'line',interaction: {elementSelect: {background: true,single: true, // Set to single-select mode},},});
Interaction can be configured at the Mark level:
({type: 'interval',interaction: { elementSelect: true },});
It can also be configured at the View level. Interactions declared on the view will be passed to marks declared in children. If the mark has declared the corresponding interaction, they will be merged; otherwise, it won't be affected.
({type: 'view',interaction: { elementSelect: true },});
Element select interaction configuration has two parts:
| Property | Description | Type | Default |
|---|---|---|---|
| background | Whether to highlight background | boolean | false |
| region | Whether clicking empty area triggers selection | boolean | false |
| single | Whether single-select mode. When set to true, only one element can be selected at a time. Clicking a selected element deselects it | boolean | false |
| multipleSelectHotkey | Hotkey code for multi-select. Hold hotkey to enable multi-select. When set, single becomes invalid. Default to multi-select mode | string | string[] | - |
Element selection style, see example Custom Selection
| Property | Description | Type | Default | Required |
|---|---|---|---|---|
| offset | Offset in the main direction | number | 0 | |
| radius | Element border radius | number | (datum, index, data) => number | 0 | |
| fill | Element fill color | string | (datum, index, data) => string | - | |
| fillOpacity | Element fill opacity | number | (datum, index, data) => number | - | |
| stroke | Element stroke | string | (datum, index, data) => string | - | |
| strokeOpacity | Element stroke opacity | number | (datum, index, data) => number | - | |
| lineWidth | Element stroke width | number | (datum, index, data) => number | - | |
| lineDash | Element stroke dash configuration. First value is dash length, second is gap length. Setting lineDash to [0,0] means no stroke. | [number,number] | (datum, index, data) => [number , number] | - | |
| opacity | Element overall opacity | number | (datum, index, data) => number | - | |
| shadowColor | Element shadow color | string | (datum, index, data) => string | - | |
| shadowBlur | Element shadow Gaussian blur coefficient | number | (datum, index, data) => number | - | |
| shadowOffsetX | Set horizontal distance of shadow from element | number | (datum, index, data) => number | - | |
| shadowOffsetY | Set vertical distance of shadow from element | number | (datum, index, data) => number | - | |
| cursor | Element mouse cursor style. Same as CSS cursor style. | string | (datum, index, data) => string | default | |
| backgroundRadius | Background border radius | number | (datum, index, data) => number | 0 | |
| backgroundFill | Background fill color | string | (datum, index, data) => string | transparent | |
| backgroundFillOpacity | Background fill opacity | number | (datum, index, data) => number | - | |
| backgroundStroke | Background stroke | string | (datum, index, data) => string | - | |
| backgroundStrokeOpacity | Background stroke opacity | number | (datum, index, data) => number | - | |
| backgroundLineWidth | Background stroke width | number | (datum, index, data) => number | - | |
| backgroundLineDash | Background stroke dash configuration. First value is dash length, second is gap length. Setting lineDash to [0,0] means no stroke. | [number,number] | (datum, index, data) => [number , number] | - | |
| backgroundOpacity | Background overall opacity | number | (datum, index, data) => number | - | |
| backgroundShadowColor | Background shadow color | string | (datum, index, data) => string | - | |
| backgroundShadowBlur | Background shadow Gaussian blur coefficient | number | (datum, index, data) => number | - | |
| backgroundShadowOffsetX | Set horizontal distance of shadow from background | number | (datum, index, data) => number | - | |
| backgroundShadowOffsetY | Set vertical distance of shadow from background | number | (datum, index, data) => number | - | |
| backgroundCursor | Background mouse cursor style. Same as CSS cursor style. | string | (datum, index, data) => string | default |
When configuring background in selected elements, it's not configured as an object, but using the background prefix with property names.
({state: {selected: {offset: 10,radius: 50,fill: '#1890FF',fillOpacity: 0.9,stroke: '#40A9FF',strokeOpacity: 0.9,lineWidth: 2,lineDash: [4, 8],opacity: 1,shadowColor: '#1890FF',shadowBlur: 10,shadowOffsetX: 5,shadowOffsetY: 5,cursor: 'pointer',backgroundRadius: 50,backgroundFill: '#E6F7FF',backgroundFillOpacity: 0.9,backgroundStroke: '#91D5FF',backgroundStrokeOpacity: 0.9,backgroundLineWidth: 2,backgroundLineDash: [4, 8],backgroundOpacity: 1,backgroundShadowColor: '#91D5FF',backgroundShadowBlur: 10,backgroundShadowOffsetX: 5,backgroundShadowOffsetY: 5,backgroundCursor: 'pointer',},},});
The following events are supported:
element:select - Triggered when element is selectedelement:unselect - Triggered when element is deselectedchart.on('element:select', (e) => {console.log(e.data.data);console.log(e.nativeEvent);});chart.on('element:unselect', (e) => {console.log(e.nativeEvent);});
The following events are supported:
element:select - Select dataelement:unselect - Deselectchart.emit('element:select', {data: { data: [{ population: 5038433 }, { population: 3983091 }] },});chart.emit('element:unselect', {});
import { Chart } from '@antv/g2';const chart = new Chart({container: 'container',});chart.options({type: 'interval',autoFit: true,data: {type: 'fetch',value:'https://gw.alipayobjects.com/os/bmw-prod/fb9db6b7-23a5-4c23-bbef-c54a55fee580.csv',},encode: { x: 'letter', y: 'frequency' },transform: [{ type: 'sortX', by: 'y', reverse: true, slice: 5 }],axis: { y: { labelFormatter: '.0%' } },interaction: { elementSelect: { background: true } },});chart.render();
import { Chart } from '@antv/g2';const chart = new Chart({container: 'container',});chart.options({type: 'interval',autoFit: true,data: {type: 'fetch',value:'https://gw.alipayobjects.com/os/bmw-prod/fb9db6b7-23a5-4c23-bbef-c54a55fee580.csv',},encode: { x: 'letter', y: 'frequency' },transform: [{ type: 'sortX', by: 'y', reverse: true, slice: 5 }],axis: { y: { labelFormatter: '.0%' } },state: {selected: {offset: 10,radius: 50,fill: (d) => (d.frequency > 0.1 ? '#F5222D' : '#1890FF'),fillOpacity: 0.9,stroke: (d) => (d.frequency > 0.1 ? '#FF4D4F' : '#40A9FF'),strokeOpacity: 0.9,lineWidth: 2,lineDash: [4, 8],opacity: 1,shadowColor: (d) => (d.frequency > 0.1 ? '#F5222D' : '#1890FF'),shadowBlur: 10,shadowOffsetX: 5,shadowOffsetY: 5,cursor: 'pointer',backgroundRadius: 50,backgroundFill: (d) => (d.frequency > 0.1 ? '#FFF1F0' : '#E6F7FF'),backgroundFillOpacity: 0.9,backgroundStroke: (d) => (d.frequency > 0.1 ? '#FFA39E' : '#91D5FF'),backgroundStrokeOpacity: 0.9,backgroundLineWidth: 2,backgroundLineDash: [4, 8],backgroundOpacity: 1,backgroundShadowColor: (d) => (d.frequency > 0.1 ? '#FFA39E' : '#91D5FF'),backgroundShadowBlur: 10,backgroundShadowOffsetX: 5,backgroundShadowOffsetY: 5,backgroundCursor: 'pointer',},},interaction: {elementSelect: {background: true,},},});chart.render();
import { Chart } from '@antv/g2';const chart = new Chart({container: 'container',});chart.options({type: 'interval',autoFit: true,data: {type: 'fetch',value:'https://gw.alipayobjects.com/os/bmw-prod/fb9db6b7-23a5-4c23-bbef-c54a55fee580.csv',},encode: { x: 'letter', y: 'frequency' },transform: [{ type: 'sortX', by: 'y', reverse: true, slice: 5 }],axis: { y: { labelFormatter: '.0%' } },interaction: {elementSelect: {single: true, // Set to single-select modebackground: true,},},});chart.render();
import { Chart } from '@antv/g2';const chart = new Chart({container: 'container',});chart.options({type: 'interval',autoFit: true,data: {type: 'fetch',value:'https://gw.alipayobjects.com/os/bmw-prod/fb9db6b7-23a5-4c23-bbef-c54a55fee580.csv',},encode: { x: 'letter', y: 'frequency' },transform: [{ type: 'sortX', by: 'y', reverse: true, slice: 5 }],axis: { y: { labelFormatter: '.0%' } },interaction: {elementSelect: {multipleSelectHotkey: 'ShiftLeft', // Hold left Shift key to enter multi-select modebackground: true,},},});chart.render();