Your search did not match any results.
Charts

Zooming and Panning API

Documentation

This example demonstrates how you can connect the Chart and RangeSelector components in order to zoom into the appropriate data range within the Chart. Move the sliders along the RangeSelector, and you will note that the value axis of the Chart is adjusted automatically.

Backend API
Copy to CodeSandBox
Apply
Reset
import React from 'react'; import Chart, { Series, Legend, CommonSeriesSettings, Point, ArgumentAxis, } from 'devextreme-react/chart'; import RangeSelector, { Size, Chart as ChartOptions, Margin, Scale, Behavior, } from 'devextreme-react/range-selector'; import { zoomingData } from './data.js'; class App extends React.Component { constructor(props) { super(props); this.state = { visualRange: { startValue: 10, endValue: 880 }, }; this.updateVisualRange = this.updateVisualRange.bind(this); } updateVisualRange(e) { this.setState({ visualRange: e.value }); } render() { return ( <React.Fragment> <Chart id="zoomedChart" palette="Harmony Light" dataSource={zoomingData} > <Series argumentField="arg" valueField="y1" /> <Series argumentField="arg" valueField="y2" /> <Series argumentField="arg" valueField="y3" /> <ArgumentAxis visualRange={this.state.visualRange} /> <Legend visible={false} /> <CommonSeriesSettings> <Point size={7} /> </CommonSeriesSettings> </Chart> <RangeSelector dataSource={zoomingData} onValueChanged={this.updateVisualRange} > <Size height={120} /> <Margin left={10} /> <Scale minorTickCount={1} startValue={10} endValue={880} /> <ChartOptions palette="Harmony Light"> <Behavior callValueChanged="onMoving" /> <Legend visible={false} /> <Series argumentField="arg" valueField="y1" /> <Series argumentField="arg" valueField="y2" /> <Series argumentField="arg" valueField="y3" /> </ChartOptions> </RangeSelector> </React.Fragment> ); } } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render( <App />, document.getElementById('app'), );
<!DOCTYPE html> <html> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/22.2.6/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import("./index.js"); </script> <link rel="stylesheet" type="text/css" href="styles.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
const zoomingData = [ { arg: 10, y1: -12, y2: 10, y3: 32, }, { arg: 20, y1: -32, y2: 30, y3: 12, }, { arg: 40, y1: -20, y2: 20, y3: 30, }, { arg: 50, y1: -39, y2: 50, y3: 19, }, { arg: 60, y1: -10, y2: 10, y3: 15, }, { arg: 75, y1: 10, y2: 10, y3: 15, }, { arg: 80, y1: 30, y2: 50, y3: 13, }, { arg: 90, y1: 40, y2: 50, y3: 14, }, { arg: 100, y1: 50, y2: 90, y3: 90, }, { arg: 105, y1: 40, y2: 175, y3: 120, }, { arg: 110, y1: -12, y2: 10, y3: 32, }, { arg: 120, y1: -32, y2: 30, y3: 12, }, { arg: 130, y1: -20, y2: 20, y3: 30, }, { arg: 140, y1: -12, y2: 10, y3: 32, }, { arg: 150, y1: -32, y2: 30, y3: 12, }, { arg: 160, y1: -20, y2: 20, y3: 30, }, { arg: 170, y1: -39, y2: 50, y3: 19, }, { arg: 180, y1: -10, y2: 10, y3: 15, }, { arg: 185, y1: 10, y2: 10, y3: 15, }, { arg: 190, y1: 30, y2: 100, y3: 13, }, { arg: 200, y1: 40, y2: 110, y3: 14, }, { arg: 210, y1: 50, y2: 90, y3: 90, }, { arg: 220, y1: 40, y2: 95, y3: 120, }, { arg: 230, y1: -12, y2: 10, y3: 32, }, { arg: 240, y1: -32, y2: 30, y3: 12, }, { arg: 255, y1: -20, y2: 20, y3: 30, }, { arg: 270, y1: -12, y2: 10, y3: 32, }, { arg: 280, y1: -32, y2: 30, y3: 12, }, { arg: 290, y1: -20, y2: 20, y3: 30, }, { arg: 295, y1: -39, y2: 50, y3: 19, }, { arg: 300, y1: -10, y2: 10, y3: 15, }, { arg: 310, y1: 10, y2: 10, y3: 15, }, { arg: 320, y1: 30, y2: 100, y3: 13, }, { arg: 330, y1: 40, y2: 110, y3: 14, }, { arg: 340, y1: 50, y2: 90, y3: 90, }, { arg: 350, y1: 40, y2: 95, y3: 120, }, { arg: 360, y1: -12, y2: 10, y3: 32, }, { arg: 367, y1: -32, y2: 30, y3: 12, }, { arg: 370, y1: -20, y2: 20, y3: 30, }, { arg: 380, y1: -12, y2: 10, y3: 32, }, { arg: 390, y1: -32, y2: 30, y3: 12, }, { arg: 400, y1: -20, y2: 20, y3: 30, }, { arg: 410, y1: -39, y2: 50, y3: 19, }, { arg: 420, y1: -10, y2: 10, y3: 15, }, { arg: 430, y1: 10, y2: 10, y3: 15, }, { arg: 440, y1: 30, y2: 100, y3: 13, }, { arg: 450, y1: 40, y2: 110, y3: 14, }, { arg: 460, y1: 50, y2: 90, y3: 90, }, { arg: 470, y1: 40, y2: 95, y3: 120, }, { arg: 480, y1: -12, y2: 10, y3: 32, }, { arg: 490, y1: -32, y2: 30, y3: 12, }, { arg: 500, y1: -20, y2: 20, y3: 30, }, { arg: 510, y1: -12, y2: 10, y3: 32, }, { arg: 520, y1: -32, y2: 30, y3: 12, }, { arg: 530, y1: -20, y2: 20, y3: 30, }, { arg: 540, y1: -39, y2: 50, y3: 19, }, { arg: 550, y1: -10, y2: 10, y3: 15, }, { arg: 555, y1: 10, y2: 10, y3: 15, }, { arg: 560, y1: 30, y2: 100, y3: 13, }, { arg: 570, y1: 40, y2: 110, y3: 14, }, { arg: 580, y1: 50, y2: 90, y3: 90, }, { arg: 590, y1: 40, y2: 95, y3: 12, }, { arg: 600, y1: -12, y2: 10, y3: 32, }, { arg: 610, y1: -32, y2: 30, y3: 12, }, { arg: 620, y1: -20, y2: 20, y3: 30, }, { arg: 630, y1: -12, y2: 10, y3: 32, }, { arg: 640, y1: -32, y2: 30, y3: 12, }, { arg: 650, y1: -20, y2: 20, y3: 30, }, { arg: 660, y1: -39, y2: 50, y3: 19, }, { arg: 670, y1: -10, y2: 10, y3: 15, }, { arg: 680, y1: 10, y2: 10, y3: 15, }, { arg: 690, y1: 30, y2: 100, y3: 13, }, { arg: 700, y1: 40, y2: 110, y3: 14, }, { arg: 710, y1: 50, y2: 90, y3: 90, }, { arg: 720, y1: 40, y2: 95, y3: 120, }, { arg: 730, y1: 20, y2: 190, y3: 130, }, { arg: 740, y1: -32, y2: 30, y3: 12, }, { arg: 750, y1: -20, y2: 20, y3: 30, }, { arg: 760, y1: -12, y2: 10, y3: 32, }, { arg: 770, y1: -32, y2: 30, y3: 12, }, { arg: 780, y1: -20, y2: 20, y3: 30, }, { arg: 790, y1: -39, y2: 50, y3: 19, }, { arg: 800, y1: -10, y2: 10, y3: 15, }, { arg: 810, y1: 10, y2: 10, y3: 15, }, { arg: 820, y1: 30, y2: 100, y3: 13, }, { arg: 830, y1: 40, y2: 110, y3: 14, }, { arg: 840, y1: 50, y2: 90, y3: 90, }, { arg: 850, y1: 40, y2: 95, y3: 120, }, { arg: 860, y1: -12, y2: 10, y3: 32, }, { arg: 870, y1: -32, y2: 30, y3: 12, }, { arg: 880, y1: -20, y2: 20, y3: 30, }, ]; export { zoomingData, };
window.config = { transpiler: 'plugin-babel', meta: { 'devextreme/localization.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, defaultExtension: 'js', map: { 'react': 'npm:react@17.0.2/umd/react.development.js', 'react-dom': 'npm:react-dom@17.0.2/umd/react-dom.development.js', 'prop-types': 'npm:prop-types@15.8.1/prop-types.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@22.2.6/cjs', 'devextreme-react': 'npm:devextreme-react@22.2.6', 'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.5.20/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.1.72/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.43/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.11', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.4/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js', }, packages: { 'devextreme': { defaultExtension: 'js', }, 'devextreme-react': { main: 'index.js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.11/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, react: true, }, }; System.config(window.config);