Discrete Axis Zooming and Panning
Documentation
Discrete data support is one of many strengths of the Chart component. In this example, you can zoom data in the Chart using another DevExtreme JavaScript UI component, the RangeSelector.
Feel free to share demo-related thoughts here.
If you have technical questions, please create a support ticket in the DevExpress Support Center.
Thank you for the feedback!
If you have technical questions, please create a support ticket in the DevExpress Support Center.
Backend API
<template>
<div>
<div id="chart-demo">
<DxChart
id="zoomedChart"
:data-source="dataSource"
palette="Soft"
title="The Chemical Composition of the Earth Layers"
>
<DxSeries
v-for="item in series"
:value-field="item.valueField"
:name="item.name"
:key="item.name"
/>
<DxCommonSeriesSettings
:ignore-empty-points="true"
type="bar"
/>
<DxValueAxis>
<DxLabel :customize-text="customizeText"/>
</DxValueAxis>
<DxArgumentAxis :visual-range="range"/>
<DxLegend
:visible="true"
vertical-alignment="top"
horizontal-alignment="right"
orientation="horizontal"
>
<DxBorder :visible="true"/>
</DxLegend>
</DxChart>
<DxRangeSelector
:data-source="dataSource"
v-model:value="range"
>
<DxSize :height="120"/>
<DxMargin :left="10"/>
<DxScale :minor-tick-count="1"/>
<DxRsChart
palette="Soft"
>
<DxRsChartSeries
v-for="item in series"
:value-field="item.valueField"
:name="item.name"
:key="item.name"
/>
<DxCommonSeriesSettingsOptions
:ignore-empty-points="true"
type="bar"
/>
</DxRsChart>
<DxBehavior value-change-mode="onHandleMove"/>
</DxRangeSelector>
</div>
</div>
</template>
<script>
import {
DxChart,
DxValueAxis,
DxArgumentAxis,
DxLabel,
DxLegend,
DxBorder,
DxCommonSeriesSettings,
DxSeries,
} from 'devextreme-vue/chart';
import {
DxRangeSelector,
DxSize,
DxMargin,
DxScale,
DxChart as DxRsChart,
DxBehavior,
DxCommonSeriesSettings as DxCommonSeriesSettingsOptions,
DxSeries as DxRsChartSeries,
} from 'devextreme-vue/range-selector';
import { dataSource } from './data.js';
export default {
components: {
DxChart,
DxValueAxis,
DxArgumentAxis,
DxLabel,
DxLegend,
DxBorder,
DxRangeSelector,
DxSize,
DxMargin,
DxScale,
DxRsChart,
DxBehavior,
DxCommonSeriesSettings,
DxCommonSeriesSettingsOptions,
DxSeries,
DxRsChartSeries,
},
data() {
return {
dataSource,
range: [],
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',
}],
};
},
methods: {
customizeText({ valueText }) {
return `${valueText}%`;
},
},
};
</script>
<style scoped>
#zoomedChart {
margin-bottom: 20px;
}
</style>
import { createApp } from 'vue';
import App from './App.vue';
createApp(App).mount('#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="dx-theme" data-theme="generic.light" href="https://cdn3.devexpress.com/jslib/23.1.5/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>
</head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"> </div>
</div>
</body>
</html>
export 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,
}];
window.exports = window.exports || {};
window.config = {
transpiler: 'plugin-babel',
meta: {
'*.vue': {
loader: 'vue-loader',
},
'*.ts': {
loader: 'demo-ts-loader',
},
'*.svg': {
loader: 'svg-loader',
},
'devextreme/localization.js': {
'esModule': true,
},
},
paths: {
'root:': '../../../../../',
'npm:': 'https://unpkg.com/',
},
map: {
'vue': 'npm:vue@3.3.4/dist/vue.esm-browser.js',
'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js',
'demo-ts-loader': 'root:utils/demo-ts-loader.js',
'svg-loader': 'root:utils/svg-loader.js',
'mitt': 'npm:mitt/dist/mitt.umd.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.1.6/cjs',
'devextreme-vue': 'npm:devextreme-vue@23.1.6',
'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js',
'devextreme-quill': 'npm:devextreme-quill@1.6.2/dist/dx-quill.min.js',
'devexpress-diagram': 'npm:devexpress-diagram@2.2.2/dist/dx-diagram.js',
'devexpress-gantt': 'npm:devexpress-gantt@4.1.49/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',
'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-vue': {
main: 'index.js',
},
'devextreme': {
defaultExtension: '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.12/inferno/package.json',
],
babelOptions: {
sourceMaps: false,
stage0: true,
},
};
System.config(window.config);