Brush and Zoom
Use VictoryZoomContainer
as your containerComponent to add panning and zooming behavior to any Victory components that work with an x-y coordinate system.
In the example below, an initial domain is set with the zoomDomain
prop. This prop may also be used to trigger pan and zoom behavior from other components.
function App() { return ( <VictoryChart theme={VictoryTheme.clean} domain={{y: [0, 100]}} containerComponent={ <VictoryZoomContainer zoomDomain={ {x: [5, 35], y: [0, 100]} } /> } > <VictoryScatter data={getScatterData()} style={{ data: { opacity: ({ datum }) => datum.y % 5 === 0 ? 1 : 0.7, fill: ({ datum }) => datum.y % 5 === 0 ? "lightblue" : "lightgreen" } }} /> </VictoryChart> ); } function getScatterData() { return _.range(50).map((index) => { return { x: _.random(1, 50), y: _.random(10, 90), size: _.random(8) + 3 }; }); } render(<App/>);
In the next example, VictoryZoomContainer
and VictoryBrushContainer
are used to create a zoomable chart with a mini-map brush control.
Here, the onZoomDomainChange
prop on VictoryZoomContainer
alters the brushDomain
prop on VictoryBrushContainer
tying highlighted brush region of the mini-map to the zoom level of the chart.
The onBrushDomainChange
prop on VictoryBrushContainer
alters the zoomDomain
prop on VictoryZoomContainer
so that the zoomed level of the chart matches the highlighted region of the mini-map.
function App() { const [state, setState] = React.useState({}); function handleZoom(domain) { setState({selectedDomain: domain}); } function handleBrush(domain) { setState({zoomDomain: domain}); } return ( <div> <VictoryChart width={550} height={300} scale={{x: "time"}} theme={VictoryTheme.clean} containerComponent={ <VictoryZoomContainer responsive={false} zoomDimension="x" zoomDomain={state.zoomDomain} onZoomDomainChange={handleZoom} /> } > <VictoryLine data={[ {x: new Date(1982, 1, 1), y: 125}, {x: new Date(1987, 1, 1), y: 257}, {x: new Date(1993, 1, 1), y: 345}, {x: new Date(1997, 1, 1), y: 515}, {x: new Date(2001, 1, 1), y: 132}, {x: new Date(2005, 1, 1), y: 305}, {x: new Date(2011, 1, 1), y: 270}, {x: new Date(2015, 1, 1), y: 470} ]} /> </VictoryChart> <VictoryChart width={550} height={90} scale={{x: "time"}} theme={VictoryTheme.clean} padding={{top: 0, left: 50, right: 50, bottom: 30}} containerComponent={ <VictoryBrushContainer responsive={false} brushDimension="x" brushDomain={state.selectedDomain} onBrushDomainChange={handleBrush} /> } > <VictoryAxis tickValues={[ new Date(1985, 1, 1), new Date(1990, 1, 1), new Date(1995, 1, 1), new Date(2000, 1, 1), new Date(2005, 1, 1), new Date(2010, 1, 1), new Date(2015, 1, 1) ]} tickFormat={(x) => new Date(x).getFullYear()} /> <VictoryLine data={[ {x: new Date(1982, 1, 1), y: 125}, {x: new Date(1987, 1, 1), y: 257}, {x: new Date(1993, 1, 1), y: 345}, {x: new Date(1997, 1, 1), y: 515}, {x: new Date(2001, 1, 1), y: 132}, {x: new Date(2005, 1, 1), y: 305}, {x: new Date(2011, 1, 1), y: 270}, {x: new Date(2015, 1, 1), y: 470} ]} /> </VictoryChart> </div> ); } render(<App/>);
VictoryBrushContainer
may be used with any Victory component that works on an x-y coordinate system.
Brushing behavior may be limited to the x or y dimensions with the brushDimension
prop, and the selected
area may be styled, or even replaced with a custom component.
<VictoryLine containerComponent={ <VictoryBrushContainer brushDomain={{x: [1, 7], y: [-3, 3]}} 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} ]} />