DevExtreme v23.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.
Line Charts


Spline charts, like line charts, allow you to visualize data and display them as lines with points placed over specified intervals. However, spline charts smooth out individual lines that connect data points.

In this example, you can use the drop-down menu under the chart to switch between the Spline, Stacked Spline, and Full-Stacked Spline chart types. A Stacked Spline chart visualizes multiple data series and allows you to compare the manner in which each series contributes to the total aggregate value for specific arguments. A Full-Stacked Spline chart helps compare the percentage value of multiple line series for each argument.

Configure Spline Charts

The functionality of Spline charts is very similar to that of line charts. You can use instructions from the Line demo description to configure Spline charts. To display a Spline, Stacked Spline, or Full-Stacked Spline series, set the type property to one of these types.

Backend API
Copy to CodeSandBox
<template> <div id="chart-demo"> <DxChart id="chart" :data-source="sharingStatisticsInfo" palette="Violet" title="Architecture Share Over Time (Count)" > <DxCommonSeriesSettings :type="type" argument-field="year" /> <DxCommonAxisSettings> <DxGrid :visible="true"/> </DxCommonAxisSettings> <DxSeries v-for="architecture in architectureSources" :key="architecture.value" :value-field="architecture.value" :name="" /> <DxMargin :bottom="20"/> <DxArgumentAxis :allow-decimals="false" :axis-division-factor="60" > <DxLabel> <DxFormat type="decimal"/> </DxLabel> </DxArgumentAxis> <DxLegend vertical-alignment="top" horizontal-alignment="right" /> <DxExport :enabled="true"/> <DxTooltip :enabled="true"/> </DxChart> <div class="options"> <div class="caption">Options</div> <div class="option"> <span>Series Type</span> <DxSelectBox :data-source="types" :input-attr="{ 'aria-label': 'Series Type' }" v-model:value="type" /> </div> </div> </div> </template> <script> import { DxChart, DxSeries, DxArgumentAxis, DxCommonSeriesSettings, DxCommonAxisSettings, DxGrid, DxExport, DxLegend, DxMargin, DxTooltip, DxLabel, DxFormat, } from 'devextreme-vue/chart'; import DxSelectBox from 'devextreme-vue/select-box'; import { architectureSources, sharingStatisticsInfo } from './data.js'; export default { components: { DxSelectBox, DxChart, DxSeries, DxArgumentAxis, DxCommonSeriesSettings, DxCommonAxisSettings, DxGrid, DxExport, DxLegend, DxMargin, DxTooltip, DxLabel, DxFormat, }, data() { return { sharingStatisticsInfo, architectureSources, types: ['spline', 'stackedspline', 'fullstackedspline'], type: 'spline', }; }, }; </script> <style> .options { padding: 20px; background-color: rgba(191, 191, 191, 0.15); margin-top: 20px; } .option { margin-top: 10px; } .caption { font-size: 18px; font-weight: 500; } .option > span { margin-right: 14px; } .option > .dx-widget { display: inline-block; vertical-align: middle; } </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="stylesheet" type="text/css" href="" /> <script src=""></script> <script src=""></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 architectureSources = [ { value: 'smp', name: 'SMP' }, { value: 'mmp', name: 'MMP' }, { value: 'cnstl', name: 'Cnstl' }, { value: 'cluster', name: 'Cluster' }, ]; export const sharingStatisticsInfo = [{ year: 1997, smp: 263, mmp: 208, cnstl: 9, cluster: 1, }, { year: 1999, smp: 169, mmp: 270, cnstl: 61, cluster: 7, }, { year: 2001, smp: 57, mmp: 261, cnstl: 157, cluster: 45, }, { year: 2003, smp: 0, mmp: 154, cnstl: 121, cluster: 211, }, { year: 2005, smp: 0, mmp: 97, cnstl: 39, cluster: 382, }, { year: 2007, smp: 0, mmp: 83, cnstl: 3, cluster: 437, }];
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:': '', }, 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.5/cjs', 'devextreme-vue': 'npm:devextreme-vue@23.1.5', '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.1/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.48/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', '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.11/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, }, }; System.config(window.config);