Discrete Axis Zooming and Panning - React Charts (2024)

Backend API

import React, { useCallback, useState } from 'react';import Chart, { ValueAxis, Label, Legend, ArgumentAxis, CommonSeriesSettings, Border, Series,} from 'devextreme-react/chart';import RangeSelector, { Size, Chart as ChartOptions, Margin, Scale, Behavior, CommonSeriesSettings as CommonSeriesSettingsOptions, Series as RsChartSeries, RangeSelectorTypes,} from 'devextreme-react/range-selector';import { VisualRange } from 'devextreme-react/common/charts';import { series, dataSource } from './data.ts';const seriesList = series.map((item) => <Series valueField={item.valueField} name={item.name} key={item.name} />);const rsChartSeriesList = series.map((item) => <RsChartSeries valueField={item.valueField} name={item.name} key={item.name} />);function formatValueAxisLabel(e: { valueText: string; }) { return `${e.valueText}%`;}function App() { const [visualRange, setVisualRange] = useState<VisualRange>({ startValue: 'Inner Core', endValue: 'Upper Crust' }); const updateVisualRange = useCallback((e: RangeSelectorTypes.ValueChangedEvent) => { setVisualRange(e.value); }, [setVisualRange]); return ( <React.Fragment> <Chart id="zoomedChart" palette="Soft" title="The Chemical Composition of the Earth Layers" dataSource={dataSource} > {seriesList} <ValueAxis> <Label customizeText={formatValueAxisLabel} /> </ValueAxis> <ArgumentAxis visualRange={visualRange} /> <CommonSeriesSettings type="bar" ignoreEmptyPoints={true} /> <Legend visible={true} verticalAlignment="top" horizontalAlignment="right" orientation="horizontal" > <Border visible={true} /> </Legend> </Chart> <RangeSelector dataSource={dataSource} onValueChanged={updateVisualRange} > <Size height={120} /> <Margin left={10} /> <Scale minorTickCount={1} startValue="Inner Core" endValue="Upper Crust" /> <Behavior valueChangeMode="onHandleMove" /> <ChartOptions palette="Soft"> {rsChartSeriesList} <Legend visible={false} /> <CommonSeriesSettingsOptions type="bar" ignoreEmptyPoints ={true} /> </ChartOptions> </RangeSelector> </React.Fragment> );}export default App;

import React, { useCallback, useState } from 'react';import Chart, { ValueAxis, Label, Legend, ArgumentAxis, CommonSeriesSettings, Border, Series,} from 'devextreme-react/chart';import RangeSelector, { Size, Chart as ChartOptions, Margin, Scale, Behavior, CommonSeriesSettings as CommonSeriesSettingsOptions, Series as RsChartSeries,} from 'devextreme-react/range-selector';import { series, dataSource } from './data.js';const seriesList = series.map((item) => ( <Series valueField={item.valueField} name={item.name} key={item.name} />));const rsChartSeriesList = series.map((item) => ( <RsChartSeries valueField={item.valueField} name={item.name} key={item.name} />));function formatValueAxisLabel(e) { return `${e.valueText}%`;}function App() { const [visualRange, setVisualRange] = useState({ startValue: 'Inner Core', endValue: 'Upper Crust', }); const updateVisualRange = useCallback( (e) => { setVisualRange(e.value); }, [setVisualRange], ); return ( <React.Fragment> <Chart id="zoomedChart" palette="Soft" title="The Chemical Composition of the Earth Layers" dataSource={dataSource} > {seriesList} <ValueAxis> <Label customizeText={formatValueAxisLabel} /> </ValueAxis> <ArgumentAxis visualRange={visualRange} /> <CommonSeriesSettings type="bar" ignoreEmptyPoints={true} /> <Legend visible={true} verticalAlignment="top" horizontalAlignment="right" orientation="horizontal" > <Border visible={true} /> </Legend> </Chart> <RangeSelector dataSource={dataSource} onValueChanged={updateVisualRange} > <Size height={120} /> <Margin left={10} /> <Scale minorTickCount={1} startValue="Inner Core" endValue="Upper Crust" /> <Behavior valueChangeMode="onHandleMove" /> <ChartOptions palette="Soft"> {rsChartSeriesList} <Legend visible={false} /> <CommonSeriesSettingsOptions type="bar" ignoreEmptyPoints={true} /> </ChartOptions> </RangeSelector> </React.Fragment> );}export default App;

import React from 'react';import ReactDOM from 'react-dom';import App from './App.tsx';ReactDOM.render( <App />, document.getElementById('app'),);

const series = [{ name: 'Si', valueField: 'Si',}, { name: 'Fe', valueField: 'Fe',}, { name: 'Ni', valueField: 'Ni',}, { name: 'S', valueField: 'S',}, { name: 'O', valueField: 'O',}, { name: 'Mg', valueField: 'Mg',}, { name: 'Al', valueField: 'Al',}, { name: 'K', valueField: 'K',}, { name: 'Na', valueField: 'Na',}];const dataSource = [{ arg: 'Inner Core', Si: 7.35, Fe: 79.39, Ni: 5.2, S: 2.3, O: 4.1,}, { arg: 'Outer Core', Si: 7.33, Fe: 78.56, Ni: 5.2, S: 2.7, O: 4.2,}, { arg: 'Lower Mantle', Si: 21.5, Fe: 5.8, O: 44.8, Mg: 22.8, Al: 2.2, Ca: 2.3, Na: 0.3, K: 0.03,}, { arg: 'Upper Mantle', Si: 28.1, Mg: 23.2, Fe: 4.3, Al: 1.2, Ca: 2.2, O: 40.3, Na: 0.2,}, { arg: 'Lower Crust', O: 46.6, Si: 27.7, Al: 8.1, Fe: 5, Ca: 3.6, Na: 2.8, K: 2.6, Mg: 1.5,}, { arg: 'Upper Crust', O: 47, Si: 29.5, Al: 8.05, Fe: 4.66, Ca: 2.96, Na: 2.5, K: 2.5, Mg: 1.87,}];export{ series, dataSource,};

window.exports = window.exports || {};window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, jsx: 'react', }, meta: { 'react': { 'esModule': true, }, 'typescript': { 'exports': 'ts', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, defaultExtension: 'js', map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', '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.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@23.2.5/cjs', 'devextreme-react': 'npm:devextreme-react@23.2.5/cjs', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.6.4/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.5/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.51/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.12', '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', 'devextreme-cldr-data': 'npm:devextreme-cldr-data@1.0.3', // 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/localization/messages': { format: 'json', defaultExtension: '', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.12/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, react: true, },};System.config(window.config);

import React from 'react';import ReactDOM from 'react-dom';import App from './App.js';ReactDOM.render(<App />, document.getElementById('app'));

const series = [ { name: 'Si', valueField: 'Si', }, { name: 'Fe', valueField: 'Fe', }, { name: 'Ni', valueField: 'Ni', }, { name: 'S', valueField: 'S', }, { name: 'O', valueField: 'O', }, { name: 'Mg', valueField: 'Mg', }, { name: 'Al', valueField: 'Al', }, { name: 'K', valueField: 'K', }, { name: 'Na', valueField: 'Na', },];const dataSource = [ { arg: 'Inner Core', Si: 7.35, Fe: 79.39, Ni: 5.2, S: 2.3, O: 4.1, }, { arg: 'Outer Core', Si: 7.33, Fe: 78.56, Ni: 5.2, S: 2.7, O: 4.2, }, { arg: 'Lower Mantle', Si: 21.5, Fe: 5.8, O: 44.8, Mg: 22.8, Al: 2.2, Ca: 2.3, Na: 0.3, K: 0.03, }, { arg: 'Upper Mantle', Si: 28.1, Mg: 23.2, Fe: 4.3, Al: 1.2, Ca: 2.2, O: 40.3, Na: 0.2, }, { arg: 'Lower Crust', O: 46.6, Si: 27.7, Al: 8.1, Fe: 5, Ca: 3.6, Na: 2.8, K: 2.6, Mg: 1.5, }, { arg: 'Upper Crust', O: 47, Si: 29.5, Al: 8.05, Fe: 4.66, Ca: 2.96, Na: 2.5, K: 2.5, Mg: 1.87, },];export { series, dataSource };

<!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/23.2.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.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.tsx"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body></html>

#zoomedChart { margin-bottom: 20px;}

Discrete Axis Zooming and Panning - React Charts (2024)
Top Articles
Latest Posts
Article information

Author: Tish Haag

Last Updated:

Views: 6449

Rating: 4.7 / 5 (67 voted)

Reviews: 82% of readers found this page helpful

Author information

Name: Tish Haag

Birthday: 1999-11-18

Address: 30256 Tara Expressway, Kutchburgh, VT 92892-0078

Phone: +4215847628708

Job: Internal Consulting Engineer

Hobby: Roller skating, Roller skating, Kayaking, Flying, Graffiti, Ghost hunting, scrapbook

Introduction: My name is Tish Haag, I am a excited, delightful, curious, beautiful, agreeable, enchanting, fancy person who loves writing and wants to share my knowledge and understanding with you.