Data Selection
Victory allows multiple ways to select data points on a chart. VictorySelectionContainer is a container component that allows users to select data points within a region of a chart. Use VictoryBrushContainer to identify the domain of a selected region.
VictorySelectionContainer is similar to VictoryBrushContainer. VictoryBrushContainer may be
used to identify the domain of a selected region, whereas VictorySelectionContainer may be used to
identify a list of data points within a selected region. VictoryBrushContainer will also create
persistent highlighted regions, whereas regions created by VictorySelectionContainer
disappear after onMouseUp events.
VictorySelectionContainer
Use VictorySelectionContainer to add data selection behavior to any Victory components that work with an x-y coordinate system.
See the full API here.
Basic
VictorySelectionContainer may be used with any Victory component that works with an x-y coordinate
system, and should be added as the containerComponent of the top-level component.
However, the component that uses it must be standalone
(standalone={true}), which is the default for all top-level Victory components.
<VictoryChart containerComponent={ <VictorySelectionContainer /> } theme={VictoryTheme.clean} > <VictoryScatter style={{ data: { fill: ({ active }) => active ? "tomato" : "gray", }, }} /> </VictoryChart>
Active Points
The VictorySelectionContainer will automatically set an active prop on the data points that are within the selected region. This prop can be used to style the selected points differently.
<VictoryChart horizontal theme={VictoryTheme.clean} containerComponent={ <VictorySelectionContainer selectionDimension="x" selectionStyle={{ stroke: VictoryTheme.clean.palette?.colors.blue, strokeWidth: 2, fill: VictoryTheme.clean.palette?.colors.blue, fillOpacity: 0.1, }} /> } > <VictoryStack> <VictoryBar style={{ data: { stroke: ({ active }) => active ? VictoryTheme.clean.palette?.colors.purple : "none", strokeWidth: 2, }, }} data={[ { x: 1, y: -5 }, { x: 2, y: 4 }, { x: 3, y: 2 }, { x: 4, y: 3 }, { x: 5, y: 1 }, { x: 6, y: -3 }, { x: 7, y: 3 }, ]} /> <VictoryBar style={{ data: { stroke: ({ active }) => active ? VictoryTheme.clean.palette?.colors.purple : "none", strokeWidth: 2, }, }} data={[ { x: 1, y: -3 }, { x: 2, y: 5 }, { x: 3, y: 3 }, { x: 4, y: 0 }, { x: 5, y: -2 }, { x: 6, y: -2 }, { x: 7, y: 5 }, ]} /> <VictoryBar style={{ data: { stroke: ({ active }) => active ? VictoryTheme.clean.palette?.colors.purple : "none", strokeWidth: 2, }, }} data={[ { x: 1, y: 5 }, { x: 2, y: -4 }, { x: 3, y: -2 }, { x: 4, y: -3 }, { x: 5, y: -1 }, { x: 6, y: 3 }, { x: 7, y: -3 }, ]} /> </VictoryStack> </VictoryChart>
Selection Limits
The selectionDimension prop may be used to limit brushing behavior to a single dimension. In the example below, the selectionDimension prop is set to "y", allowing users to select a region of the chart along the y-axis only.
<VictoryChart containerComponent={ <VictorySelectionContainer selectionDimension="y" /> } theme={VictoryTheme.clean} > <VictoryScatter style={{ data: { fill: ({ active }) => active ? "tomato" : "gray", }, }} /> </VictoryChart>
Events
Use the onSelection prop to define a function that will be called with the selected domain
when the selection area changes.
function App() { const [selection, setSelection] = React.useState({}); const handleSelection = ( datasets, ) => { const points = datasets.reduce( (memo, dataset) => memo.concat(dataset.data), [], ); setSelection({ points }); }; return ( <VictoryChart theme={VictoryTheme.clean} containerComponent={ <VictorySelectionContainer selectionDimension="x" selectionStyle={{ stroke: VictoryTheme.clean.palette ?.colors.red, strokeWidth: 2, fill: VictoryTheme.clean .palette?.colors.red, fillOpacity: 0.1, }} onSelection={handleSelection} /> } > <VictoryLine style={{ data: { stroke: VictoryTheme.clean.palette ?.colors.purple, }, }} data={[ { x: 1, y: -5 }, { x: 2, y: 4 }, { x: 3, y: 2 }, { x: 4, y: 3 }, { x: 5, y: 1 }, { x: 6, y: -3 }, { x: 7, y: 3 }, ]} /> <VictoryLine style={{ data: { stroke: VictoryTheme.clean.palette ?.colors.green, }, }} data={[ { x: 1, y: -3 }, { x: 2, y: 5 }, { x: 3, y: 3 }, { x: 4, y: 0 }, { x: 5, y: -2 }, { x: 6, y: -2 }, { x: 7, y: 5 }, ]} /> <VictoryLine style={{ data: { stroke: VictoryTheme.clean.palette ?.colors.blue, }, }} data={[ { x: 1, y: 5 }, { x: 2, y: -4 }, { x: 3, y: -2 }, { x: 4, y: -3 }, { x: 5, y: -1 }, { x: 6, y: 3 }, { x: 7, y: -3 }, ]} /> {selection && ( <VictoryLabel x={20} y={20} text={JSON.stringify( selection.points?.map( ({ x, y }) => ({ x, y }), ), )} /> )} </VictoryChart> ); } render(<App />);
VictoryBrushContainer
Use VictoryBrushContainer to add highlighting and selection to any Victory components that work with an x-y coordinate system.
See the full API here.
Basic
In the example below, the VictoryBrushContainer component is used to highlight a region of a line chart. The brush behavior is unconstrained by default, allowing users to click and drag to select a region of the chart.
<VictoryLine containerComponent={ <VictoryBrushContainer brushStyle={{ fill: "blue", opacity: 0.2, }} /> } style={{ data: { stroke: "lightblue" }, }} data={[ { x: 1, y: -3 }, { x: 2, y: 5 }, { x: 3, y: -3 }, { x: 4, y: 0 }, { x: 5, y: -5 }, { x: 6, y: 2 }, { x: 7, y: 0 }, ]} />
Selection Limits
The brushDimension prop may be used to limit brushing behavior to a single dimension. In the example below, the brushDimension prop is set to "y", allowing users to select a region of the chart along the y-axis only and the brushDomain restricts the highlighted area to the specified range.
<VictoryLine containerComponent={ <VictoryBrushContainer brushDomain={{ x: [1, 7], y: [-2, 2], }} brushDimension="y" brushStyle={{ fill: "blue", opacity: 0.2, }} /> } style={{ data: { stroke: "lightblue" }, }} data={[ { x: 1, y: -3 }, { x: 2, y: 5 }, { x: 3, y: -3 }, { x: 4, y: 0 }, { x: 5, y: -5 }, { x: 6, y: 2 }, { x: 7, y: 0 }, ]} />
Events
VictoryBrushContainer exposes several events you can use to access the selection range. In the example below, you can monitor your browser's console to see the events in action.
<VictoryChart theme={VictoryTheme.clean} containerComponent={ <VictoryBrushContainer onBrushCleared={(domain, props) => console.log( "[onBrushCleared]", { domain, props }, ) } onBrushDomainChange={( domain, props, ) => console.log( "[onBrushDomainChange]", { domain, props }, ) } onBrushDomainChangeEnd={( domain, props, ) => console.log( "[onBrushDomainChangeEnd]", { domain, props }, ) } /> } > <VictoryGroup> <VictoryScatter style={{ data: { fill: VictoryTheme.clean .palette?.colors.red, }, }} data={[ { x: 1, y: -5 }, { x: 2, y: 4 }, { x: 3, y: 2 }, { x: 4, y: 0 }, { x: 5, y: 1 }, { x: 6, y: -3 }, { x: 7, y: 3 }, ]} /> <VictoryScatter style={{ data: { fill: VictoryTheme.clean .palette?.colors.yellow, }, }} data={[ { x: 1, y: -3 }, { x: 2, y: 5 }, { x: 3, y: 3 }, { x: 4, y: 0 }, { x: 5, y: -2 }, { x: 6, y: -2 }, { x: 7, y: 5 }, ]} /> <VictoryScatter data={[ { x: 1, y: 5 }, { x: 2, y: -4 }, { x: 3, y: -2 }, { x: 4, y: -3 }, { x: 5, y: -1 }, { x: 6, y: 3 }, { x: 7, y: -3 }, ]} /> </VictoryGroup> </VictoryChart>