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 setup lang="ts">
import { ref } from 'vue';
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.ts';
const range = ref([]);
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 customizeText = ({ valueText }) => `${valueText}%`;
</script>
<style scoped>
#zoomedChart {
margin-bottom: 20px;
}
</style>
window.exports = window.exports || {};
window.config = {
transpiler: 'plugin-babel',
meta: {
'*.vue': {
loader: 'vue-loader',
},
'*.ts': {
loader: 'demo-ts-loader',
},
'*.svg': {
loader: 'svg-loader',
},
'devextreme/time_zone_utils.js': {
'esModule': true,
},
'devextreme/localization.js': {
'esModule': true,
},
'devextreme/viz/palette.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.2.5/cjs',
'devextreme-vue': 'npm:devextreme-vue@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',
'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);
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,
}];
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.2.5/css/dx.light.css" />
<script src="https://unpkg.com/typescript@4.2.4/lib/typescript.js"></script>
<script type="module">
import * as vueCompilerSFC from "https://unpkg.com/@vue/compiler-sfc@3.3.4/dist/compiler-sfc.esm-browser.js";
window.vueCompilerSFC = vueCompilerSFC;
</script>
<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.ts");
</script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"> </div>
</div>
</body>
</html>