Zooming in React Chart component
20 Jan 202324 minutes to read
To get start quickly with React Chart Zooming and Panning, you can check on this video:
Enable Zooming
Chart can be zoomed in three ways.
- Selection - By setting
enableSelectionZooming
property to true inzoomSettings
, you can zoom the chart by using the rubber band selection. - Mousewheel - By setting
enableMouseWheelZooming
property to true inzoomSettings
, you can zoomin and zoomout the chart by scrolling the mouse wheel. - Pinch - By setting
enablePinchZooming
property to true inzoomSettings
, you can zoom the chart through pinch gesture in touch enabled devices.
Note: Pinch zooming is supported only in browsers that support multi-touch gestures. Currently IE11,
Chrome and Opera browsers support multi-touch in desktop devices.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom } from '@syncfusion/ej2-react-charts';
import { zoomData } from 'datasource.ts';
function App() {
const primaryxAxis = { valueType: 'DateTime' };
const legendSettings = { visible: false };
const zoomsettings = {
enableMouseWheelZooming: true, enablePinchZooming: true,
enableSelectionZooming: true
};
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
return <ChartComponent id='charts' primaryXAxis={primaryxAxis} legendSettings={legendSettings} zoomSettings={zoomsettings} title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' opacity={0.3} name='Product X' type='Area' border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,LegendSettingsModel,ZoomSettingsModel,
Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom}
from'@syncfusion/ej2-react-charts';
import { zoomData } from 'datasource.ts';
function App() {
const primaryxAxis: AxisModel = { valueType: 'DateTime' };
const legendSettings: LegendSettingsModel = { visible: false };
const zoomsettings: ZoomSettingsModel = {
enableMouseWheelZooming: true, enablePinchZooming: true,
enableSelectionZooming: true
};
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
return <ChartComponent id='charts'
primaryXAxis={primaryxAxis}
legendSettings={legendSettings}
zoomSettings={zoomsettings}
title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' opacity={0.3} name='Product X' type='Area'
border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
After zooming the chart, a zooming toolbar will appear with zoom
,zoomin
, zoomout
, pan
and reset
buttons. Selecting the Pan option will allow to pan the chart and selecting the Reset option will reset the zoomed chart.
Modes
The mode
property in zoomSettings specifies whether the chart is allowed to scale along the horizontal axis or vertical axis. The default value of the mode is XY (both axis).
There are three types of mode.
- X - Allows us to zoom the chart horizontally.
- Y - Allows us to zoom the chart vertically.
- XY - Allows us to zoom the chart both vertically and horizontally.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom } from '@syncfusion/ej2-react-charts';
import { zoomData } from 'datasource.ts';
function App() {
const primaryxAxis = { valueType: 'DateTime' };
const legendSettings = { visible: false };
const zoomsettings = { mode: 'X', enableSelectionZooming: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
return <ChartComponent id='charts' primaryXAxis={primaryxAxis} legendSettings={legendSettings} zoomSettings={zoomsettings} title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' opacity={0.3} name='Product X' type='Area' border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,LegendSettingsModel,ZoomSettingsModel,
Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom}
from'@syncfusion/ej2-react-charts';
function App() {
const primaryxAxis: AxisModel = { valueType: 'DateTime' };
const legendSettings: LegendSettingsModel = { visible: false };
const zoomsettings: ZoomSettingsModel = { mode: 'X', enableSelectionZooming: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
const zoomData: Object[] = [
{ x: new Date(2016, 0, 1), y: 7.1 }, { x: new Date(2016, 1, 1), y: 3.7 },
{ x: new Date(2016, 2, 1), y: 0.8 }, { x: new Date(2016, 3, 1), y: 6.3 },
{ x: new Date(2016, 4, 1), y: 13.3 }, { x: new Date(2016, 5, 1), y: 18.0 },
{ x: new Date(2016, 6, 1), y: 19.8 }, { x: new Date(2016, 7, 1), y: 18.1 },
{ x: new Date(2016, 8, 1), y: 13.1 }, { x: new Date(2016, 9, 1), y: 4.1 },
{ x: new Date(2016, 10, 1), y: -3.8 }, { x: new Date(2016, 11, 1), y: -6.8 }
];
return <ChartComponent id='charts'
primaryXAxis={primaryxAxis}
legendSettings={legendSettings}
zoomSettings={zoomsettings}
title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' opacity={0.3} name='Product X' type='Area'
border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
Toolbar
By default, zoomin, zoomout, pan and reset buttons will be displayed for zoomed chart. You can customize to show the desired options in the toolbar using the toolbarItems
property. Also using the showToolbar
property, you can show toolkit for zooming and panning the chart during initial rendering itself.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom } from '@syncfusion/ej2-react-charts';
import { zoomData } from 'datasource.ts';
function App() {
const primaryxAxis = { valueType: 'DateTime' };
const legendSettings = { visible: false };
const zoomsettings = { enableSelectionZooming: true, toolbarItems: ['Zoom', 'Pan', 'Reset'], showToolbar: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
return <ChartComponent id='charts' primaryXAxis={primaryxAxis} legendSettings={legendSettings} zoomSettings={zoomsettings} title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' name='Product X' opacity={0.3} type='Area' border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,LegendSettingsModel,ZoomSettingsModel,
Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom}
from'@syncfusion/ej2-react-charts';
function App() {
const primaryxAxis: AxisModel = { valueType: 'DateTime' };
const legendSettings: LegendSettingsModel = { visible: false };
const zoomsettings: ZoomSettingsModel = { enableSelectionZooming: true, toolbarItems: ['Zoom', 'Pan', 'Reset'], showToolbar: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
const zoomData: Object[] = [
{ x: new Date(2016, 0, 1), y: 7.1 }, { x: new Date(2016, 1, 1), y: 3.7 },
{ x: new Date(2016, 2, 1), y: 0.8 }, { x: new Date(2016, 3, 1), y: 6.3 },
{ x: new Date(2016, 4, 1), y: 13.3 }, { x: new Date(2016, 5, 1), y: 18.0 },
{ x: new Date(2016, 6, 1), y: 19.8 }, { x: new Date(2016, 7, 1), y: 18.1 },
{ x: new Date(2016, 8, 1), y: 13.1 }, { x: new Date(2016, 9, 1), y: 4.1 },
{ x: new Date(2016, 10, 1), y: -3.8 }, { x: new Date(2016, 11, 1), y: -6.8 }
];
return <ChartComponent id='charts'
primaryXAxis={primaryxAxis}
legendSettings={legendSettings}
zoomSettings={zoomsettings}
title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' name='Product X' opacity={0.3} type='Area'
border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
Eanble Scrollbar
Using enableScrollbar
property, you can able to add scrollbar for zoomed chart. Using this scrollbar, you can pan or zoom the chart.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom, ScrollBar } from '@syncfusion/ej2-react-charts';
import { zoomData } from 'datasource.ts';
function App() {
const primaryxAxis = { valueType: 'DateTime', zoomFactor: 0.2, zoomPosition: 0.6 };
const legendSettings = { visible: false };
const zoomsettings = { enableSelectionZooming: true, enableScrollbar: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
return <ChartComponent id='charts' primaryXAxis={primaryxAxis} legendSettings={legendSettings} zoomSettings={zoomsettings} title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime, ScrollBar]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' name='Product X' opacity={0.3} type='Area' border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,LegendSettingsModel,ZoomSettingsModel,
Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom, ScrollBar }
from'@syncfusion/ej2-react-charts';
function App() {
const primaryxAxis: AxisModel = { valueType: 'DateTime', zoomFactor: 0.2, zoomPosition: 0.6 };
const legendSettings: LegendSettingsModel = { visible: false };
const zoomsettings: ZoomSettingsModel = { enableSelectionZooming: true, enableScrollbar: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
const zoomData: Object[] = [
{ x: new Date(2016, 0, 1), y: 7.1 }, { x: new Date(2016, 1, 1), y: 3.7 },
{ x: new Date(2016, 2, 1), y: 0.8 }, { x: new Date(2016, 3, 1), y: 6.3 },
{ x: new Date(2016, 4, 1), y: 13.3 }, { x: new Date(2016, 5, 1), y: 18.0 },
{ x: new Date(2016, 6, 1), y: 19.8 }, { x: new Date(2016, 7, 1), y: 18.1 },
{ x: new Date(2016, 8, 1), y: 13.1 }, { x: new Date(2016, 9, 1), y: 4.1 },
{ x: new Date(2016, 10, 1), y: -3.8 }, { x: new Date(2016, 11, 1), y: -6.8 }
];
return <ChartComponent id='charts'
primaryXAxis={primaryxAxis}
legendSettings={legendSettings}
zoomSettings={zoomsettings}
title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime, ScrollBar]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' name='Product X' opacity={0.3} type='Area'
border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
Enable Pan
Using enablePan
property you can able to pan the zoomed chart without help of toolbar items.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom } from '@syncfusion/ej2-react-charts';
import { zoomData } from 'datasource.ts';
function App() {
const primaryxAxis = { valueType: 'DateTime', zoomFactor: 0.2, zoomPosition: 0.6 };
const legendSettings = { visible: false };
const zoomSettings = { enableSelectionZooming: true, enablePan: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
return <ChartComponent id='charts' primaryXAxis={primaryxAxis} legendSettings={legendSettings} zoomSettings={zoomSettings} title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' name='Product X' opacity={0.3} type='Area' border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,LegendSettingsModel,ZoomSettingsModel,
Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom}
from'@syncfusion/ej2-react-charts';
function App() {
const primaryxAxis: AxisModel = { valueType: 'DateTime', zoomFactor: 0.2, zoomPosition: 0.6 };
const legendSettings: LegendSettingsModel = { visible: false };
const zoomSettings: ZoomSettingsModel = { enableSelectionZooming: true, enablePan: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
const zoomData: Object[] = [
{ x: new Date(2016, 0, 1), y: 7.1 }, { x: new Date(2016, 1, 1), y: 3.7 },
{ x: new Date(2016, 2, 1), y: 0.8 }, { x: new Date(2016, 3, 1), y: 6.3 },
{ x: new Date(2016, 4, 1), y: 13.3 }, { x: new Date(2016, 5, 1), y: 18.0 },
{ x: new Date(2016, 6, 1), y: 19.8 }, { x: new Date(2016, 7, 1), y: 18.1 },
{ x: new Date(2016, 8, 1), y: 13.1 }, { x: new Date(2016, 9, 1), y: 4.1 },
{ x: new Date(2016, 10, 1), y: -3.8 }, { x: new Date(2016, 11, 1), y: -6.8 }
];
return <ChartComponent id='charts'
primaryXAxis={primaryxAxis}
legendSettings={legendSettings}
zoomSettings={zoomSettings}
title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' name='Product X' opacity={0.3} type='Area'
border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
Auto interval on zooming
By using enableAutoIntervalOnZooming
property, the axis interval will get calculated automatically with respect to the zoomed range.
import * as React from "react";
import * as ReactDOM from "react-dom";
import { ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject, Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom } from '@syncfusion/ej2-react-charts';
import { zoomData } from 'datasource.ts';
function App() {
const primaryxAxis = { valueType: 'DateTime', enableAutoIntervalOnZooming: true };
const legendSettings = { visible: false };
const zoomSettings = { enableSelectionZooming: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
return <ChartComponent id='charts' primaryXAxis={primaryxAxis} legendSettings={legendSettings} zoomSettings={zoomSettings} title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]}/>
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' name='Product X' opacity={0.3} type='Area' border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>;
}
;
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
import * as React from "react";
import * as ReactDOM from "react-dom";
import { AxisModel, ChartComponent, SeriesCollectionDirective, SeriesDirective, Inject,LegendSettingsModel,ZoomSettingsModel,
Legend, DateTime, Tooltip, DataLabel, AreaSeries, Zoom}
from'@syncfusion/ej2-react-charts';
function App() {
const primaryxAxis: AxisModel = { valueType: 'DateTime', enableAutoIntervalOnZooming: true };
const legendSettings: LegendSettingsModel = { visible: false };
const zoomSettings: ZoomSettingsModel = { enableSelectionZooming: true };
const border = { width: 0.5, color: '#00bdae' };
const animation = { enable: false };
const zoomData: Object[] = [
{ x: new Date(2016, 0, 1), y: 7.1 }, { x: new Date(2016, 1, 1), y: 3.7 },
{ x: new Date(2016, 2, 1), y: 0.8 }, { x: new Date(2016, 3, 1), y: 6.3 },
{ x: new Date(2016, 4, 1), y: 13.3 }, { x: new Date(2016, 5, 1), y: 18.0 },
{ x: new Date(2016, 6, 1), y: 19.8 }, { x: new Date(2016, 7, 1), y: 18.1 },
{ x: new Date(2016, 8, 1), y: 13.1 }, { x: new Date(2016, 9, 1), y: 4.1 },
{ x: new Date(2016, 10, 1), y: -3.8 }, { x: new Date(2016, 11, 1), y: -6.8 }
];
return <ChartComponent id='charts'
primaryXAxis={primaryxAxis}
legendSettings={legendSettings}
zoomSettings={zoomSettings}
title='Sales History of Product X'>
<Inject services={[AreaSeries, Legend, Tooltip, DataLabel, Zoom, DateTime]} />
<SeriesCollectionDirective>
<SeriesDirective dataSource={zoomData} xName='x' yName='y' name='Product X' opacity={0.3} type='Area'
border={border} animation={animation}>
</SeriesDirective>
</SeriesCollectionDirective>
</ChartComponent>
};
export default App;
ReactDOM.render(<App />, document.getElementById("charts"));
Note: To use zooming feature, we need to inject
Zoom
module into theservices
.