Loading...
The brushHighlight
interaction targets chart elements. It highlights elements within the selected brush area and supports dragging and resizing the brush selection.
Trigger: Brush selection of elements.
End: Click on chart area.
Affected states:
Elements within the brush range change to active
state.
Elements outside the brush range change to inactive
state.
Built-in interaction states:
({// Define inactive state element opacity as 0.5state: { inactive: { opacity: 0.5 } },});
import { Chart } from '@antv/g2';const chart = new Chart({ container: 'container' });chart.options({type: 'point',autoFit: true,data: {type: 'fetch',value:'https://gw.alipayobjects.com/os/basement_prod/6b4aa721-b039-49b9-99d8-540b3f87d339.json',},encode: { x: 'height', y: 'weight', color: 'gender' },state: { inactive: { stroke: 'gray' } },interaction: { brushHighlight: true },});chart.render();
There are two ways to configure the brushHighlight
interaction:
First, pass a boolean
to set whether to enable the interaction.
({type: 'interval',interaction: { brushHighlight: true }, // Use default configuration});
Second, pass configuration options to configure the interaction.
({type: 'line',interaction: {brushHighlight: {series: true,},},});
Interaction can be configured at the Mark level:
({type: 'interval',interaction: { brushHighlight: 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: { brushHighlight: true },});
Property | Description | Type | Default | Required |
---|---|---|---|---|
reverse | Whether to reverse the brush | boolean | false | |
series | Whether brush affects series elements, controls the highlighting mode of selected elements | boolean | false | |
facet | Whether brush spans across facets, controls interaction behavior | boolean | false | |
selectedHandles | Directions of handles that can be resized | string[] | ['handle-n','handle-e','handle-s','handle-w','handle-nw','handle-ne','handle-se','handle-sw'] | |
brushRegion | Custom brush region, usually not configured, used internally by G2 for brushXHighlight and brushYHighlight | (x, y, x1, y1, extent) => any | (x, y, x1, y1) => [x, y, x1, y1] | |
mask | Mask style for brush area | mask | See mask | |
maskHandle | Handle style for brush area | maskHandle | See maskHandle |
The series
parameter is a key switch that controls the brush highlight mode, determining how to provide visual feedback for graphic elements. When configured as series: false
, it's more suitable for scatter plots, bar charts and other discrete elements, directly modifying element states (for continuous graphics like line charts, it changes the state of the entire line); when configured as series: true
, continuous graphics like line charts and area charts will highlight local paths. Please enable or disable as needed.
series: false
import { Chart } from '@antv/g2';const chart = new Chart({container: 'container',});const config = {type: 'line',interaction: { brushHighlight: { series: false } },data: [{ year: '1991', value: 3 },{ year: '1992', value: 4 },{ year: '1993', value: 3.5 },{ year: '1994', value: 5 },{ year: '1995', value: 4.9 },{ year: '1996', value: 6 },{ year: '1997', value: 7 },{ year: '1998', value: 9 },{ year: '1999', value: 13 },],encode: { x: 'year', y: 'value' },scale: { x: { range: [0, 1] }, y: { domainMin: 0, nice: true } },state: { active: { stroke: 'red' } },labels: [{ text: 'value', style: { dx: -10, dy: -12 } }],};chart.options(config);chart.render();
series: true
import { Chart } from '@antv/g2';const chart = new Chart({container: 'container',});const config = {type: 'line',interaction: { brushHighlight: { series: true } },data: [{ year: '1991', value: 3 },{ year: '1992', value: 4 },{ year: '1993', value: 3.5 },{ year: '1994', value: 5 },{ year: '1995', value: 4.9 },{ year: '1996', value: 6 },{ year: '1997', value: 7 },{ year: '1998', value: 9 },{ year: '1999', value: 13 },],encode: { x: 'year', y: 'value' },scale: { x: { range: [0, 1] }, y: { domainMin: 0, nice: true } },state: { active: { stroke: 'red' } },labels: [{ text: 'value', style: { dx: -10, dy: -12 } }],};chart.options(config);chart.render();
Configure the style of the brush area mask.
Property | Description | Type | Default | Required |
---|---|---|---|---|
maskFill | Mask fill color | string | #777 | |
maskFillOpacity | Mask fill opacity | number | 0.3 | |
maskStroke | Mask stroke | string | #fff | |
maskStrokeOpacity | Stroke opacity | number | ||
maskLineWidth | Mask stroke width | number | ||
maskLineDash | Stroke dash configuration. First value is dash length, second is gap length. Setting to [0,0] means no stroke. | [number,number] | ||
maskOpacity | Mask overall opacity | number | ||
maskShadowColor | Mask shadow color | string | ||
maskShadowBlur | Mask shadow Gaussian blur coefficient | number | ||
maskShadowOffsetX | Set horizontal distance of shadow from mask | number | ||
maskShadowOffsetY | Set vertical distance of shadow from mask | number | ||
maskCursor | Mouse cursor style. Same as CSS cursor style | string | default |
When configuring brush area mask style, it's not configured as an object, but using the mask
prefix with property names.
({interaction: {brushHighlight: {maskFill: '#000',maskFillOpacity: 0.2,maskStroke: 'red',maskStrokeOpacity: 0.9,maskLineWidth: 2,maskLineDash: [4, 8],maskOpacity: 0.2,maskShadowColor: '#d3d3d3',maskShadowBlur: 10,maskShadowOffsetX: 10,maskShadowOffsetY: 10,maskCursor: 'pointer',},},});
The names of handles in eight directions are as follows (named according to north, south, east, west). Set corresponding properties in the format mask[handleName][styleAttribute]
, or set width through maskHandleSize
.
Property | Description | Type | Default | Required |
---|---|---|---|---|
mask[handleName]Render | Custom mask handle rendering function | (g, options, document) => DisplayObject | ||
mask[handleName]Size | Mask handle width | string | ||
mask[handleName]Fill | Mask handle fill color | string | ||
mask[handleName]FillOpacity | Mask handle fill opacity | number | ||
mask[handleName]Stroke | Mask handle stroke | string | ||
mask[handleName]StrokeOpacity | Stroke opacity | number | ||
mask[handleName]LineWidth | Mask handle stroke width | number | ||
mask[handleName]LineDash | Stroke dash configuration. First value is dash length, second is gap length. Setting to [0,0] means no stroke. | [number,number] | ||
mask[handleName]Opacity | Mask handle overall opacity | number | ||
mask[handleName]ShadowColor | Mask handle shadow color | string | ||
mask[handleName]ShadowBlur | Mask handle shadow Gaussian blur coefficient | number | ||
mask[handleName]ShadowOffsetX | Set horizontal distance of shadow from mask handle | number | ||
mask[handleName]ShadowOffsetY | Set vertical distance of shadow from mask handle | number | ||
mask[handleName]Cursor | Mouse cursor style. Same as CSS cursor style | string | default |
chart.options({type: 'point',data: {type: 'fetch',value: 'data/penguins.csv',},encode: {color: 'species',x: 'culmen_length_mm',y: 'culmen_depth_mm',},state: {inactive: { stroke: 'gray', opacity: 0.5 },},interaction: {brushHighlight: {maskHandleNFill: 'blue',maskHandleEFill: 'red',maskHandleSFill: 'green',maskHandleWFill: 'yellow',maskHandleNWFill: 'black',maskHandleNEFill: 'steelblue',maskHandleSEFill: 'pink',maskHandleSWFill: 'orange',},},});
The following events are supported:
brush:start
- Triggered when starting to create brushbrush:end
- Triggered when brush size and position update is completebrush:remove
- Triggered when brush is removedbrush:highlight
- Triggered when brush changes size and positionchart.on('brush:highlight', (e) => {console.log(e.data.selection);console.log(e.nativeEvent);});
The following events are supported:
brush:highlight
- Highlight databrush:remove
- Remove brushchart.emit('brush:remove');chart.emit('brush:highlight', { data: { selection } });
You can specify the handle rendering function through mask[handleName]Render
to render custom handles. The function signature is as follows:
function render(g, // Mount containeroptions, // Style properties, set through mask[handleName][styleAttribute]document, // Canvas document, used to create sub-graphics) {// Need to return the created graphic}
Here's an example of creating a path handle:
function renderPath(group, options, document) {// Creation logic// If it's the first render, create and mount the graphicif (!group.handle) {// Create graphics through document.createElementconst path = document.createElement('path');group.handle = path;group.appendChild(group.handle);}// Update logicconst { handle } = group;const { width, height, ...rest } = options;if (width === undefined || height === undefined) return handle;handle.attr(rest);// Return corresponding valuereturn handle;}
function createPathRender(path) {return (group, options, document) => {if (!group.handle) {const path = document.createElement('path');group.handle = path;group.appendChild(group.handle);}const { handle } = group;const { x, y, width, height, ...rest } = options;if (width === undefined || height === undefined) return handle;handle.style.d = path(x, y, width, height);handle.attr(rest);return handle;};}chart.options({type: 'point',data: {type: 'fetch',value: 'data/penguins.csv',},encode: {color: 'species',x: 'culmen_length_mm',y: 'culmen_depth_mm',},state: {inactive: { stroke: 'gray', opacity: 0.5 },},interaction: {brushHighlight: {maskHandleSize: 30,maskHandleNRender: createPathRender((x, y, width, height) => {return `M${x},${y + height / 2}L${x + width / 2},${y - height / 2}L${x + width},${y + height / 2},Z`;}),maskHandleERender: createPathRender((x, y, width, height) =>`M${x + width / 2},${y}L${x + (width * 3) / 2},${y + height / 2}L${x + width / 2},${y + height},Z`,),maskHandleSRender: createPathRender((x, y, width, height) =>`M${x},${y + height / 2}L${x + width / 2},${y + (height / 2) * 3}L${x + width},${y + height / 2},Z`,),maskHandleWRender: createPathRender((x, y, width, height) =>`M${x + width / 2},${y}L${x - width},${y + height / 2}L${x + width / 2},${y + height},Z`,),maskHandleNWRender: createPathRender((x, y, width, height) =>`M${x},${y}L${x + width},${y + height / 2}L${x + width / 2},${y + height},Z`,),maskHandleNERender: createPathRender((x, y, width, height) =>`M${x},${y + height / 2}L${x + width},${y}L${x + width / 2},${y + height},Z`,),maskHandleSERender: createPathRender((x, y, width, height) =>`M${x + width / 2},${y}L${x + width},${y + height}L${x},${y + height / 2},Z`,),maskHandleSWRender: createPathRender((x, y, width, height) =>`M${x + width / 2},${y}L${x + width},${y + height / 2}L${x},${y + height},Z`,),maskHandleNFill: 'blue',maskHandleEFill: 'red',maskHandleSFill: 'green',maskHandleWFill: 'yellow',maskHandleNWFill: 'black',maskHandleNEFill: 'steelblue',maskHandleSEFill: 'pink',maskHandleSWFill: 'orange',},},});
Some interactions change element states. We can change the interaction effect by configuring the appearance of element states.
import { Chart } from '@antv/g2';const chart = new Chart({container: 'container',});chart.options({type: 'point',autoFit: true,data: {type: 'fetch',value:'https://gw.alipayobjects.com/os/basement_prod/6b4aa721-b039-49b9-99d8-540b3f87d339.json',},encode: { x: 'height', y: 'weight', color: 'gender' },state: {inactive: { stroke: 'gray', opacity: 0.5 },active: { lineWidth: 5 },},interaction: { brushHighlight: true },});chart.render();