DevExtreme v23.2 is now available.

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

Your search did not match any results.

Line

Line charts help visualize data and display them as lines with points placed over specified intervals. This demo shows how to initialize and configure Line, Stacked Line, and Full-Stacked Line charts. A Stacked Line 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 Line chart helps compare the percentage value of multiple line series for each argument. Use the drop-down menu under the chart to switch between chart types.

Bind to Data

You can bind line charts to one of the following data sources:

In this demo, the chart is populated with data from a local JavaScript array.

Configure Series

The series type defines the appearance of your chart. To display a Line, Stacked Line, or Full-Stacked Line series, set the type property to one of these types.

You also need to bind the series to data. Set the argumentField and valueField properties to data fields that contain arguments and values for your series. You can specify these properties in an object in the series array or include them in the commonSeriesSettings object. In this demo, the argumentField and type properties are specified for all series in the commonSeriesSettings object.

Enable Tooltips

When you hover the mouse pointer over a series point, it shows a tooltip with information about the series point. To display tooltips, you need to enable the tooltip.enabled property.

Export Chart to Image

To allow a user to print the chart or export it as a PNG, JPEG, or SVG file, set the export.enabled property to true. This setting adds a button that opens a drop-down menu with export and print commands. In this demo, you can find this button in the upper-right corner.

Backend API
import React, { useCallback, useState } from 'react'; import SelectBox, { SelectBoxTypes } from 'devextreme-react/select-box'; import { Chart, Series, ArgumentAxis, CommonSeriesSettings, Export, Legend, Margin, Title, Subtitle, Tooltip, Grid, } from 'devextreme-react/chart'; import { Properties as ChartPropsType } from 'devextreme/viz/chart'; import service from './data.ts'; const countriesInfo = service.getCountriesInfo(); const energySources = service.getEnergySources(); const types: (ChartPropsType['commonSeriesSettings']['type'])[] = ['line', 'stackedline', 'fullstackedline']; const seriesTypeLabel = { 'aria-label': 'Series Type' }; function App() { const [type, setType] = useState(types[0]); const handleChange = useCallback((e: SelectBoxTypes.ValueChangedEvent) => { setType(e.value); }, []); return ( <React.Fragment> <Chart palette="Violet" dataSource={countriesInfo}> <CommonSeriesSettings argumentField="country" type={type} /> {energySources.map((item) => ( <Series key={item.value} valueField={item.value} name={item.name} /> ))} <Margin bottom={20} /> <ArgumentAxis valueMarginsEnabled={false} discreteAxisDivisionMode="crossLabels"> <Grid visible={true} /> </ArgumentAxis> <Legend verticalAlignment="bottom" horizontalAlignment="center" itemTextPosition="bottom" /> <Export enabled={true} /> <Title text="Energy Consumption in 2004"> <Subtitle text="(Millions of Tons, Oil Equivalent)" /> </Title> <Tooltip enabled={true} /> </Chart> <div className="options"> <div className="caption">Options</div> <div className="option"> <span>Series Type </span> <SelectBox dataSource={types} inputAttr={seriesTypeLabel} value={type} onValueChanged={handleChange} /> </div> </div> </React.Fragment> ); } export default App;
import React, { useCallback, useState } from 'react'; import SelectBox from 'devextreme-react/select-box'; import { Chart, Series, ArgumentAxis, CommonSeriesSettings, Export, Legend, Margin, Title, Subtitle, Tooltip, Grid, } from 'devextreme-react/chart'; import service from './data.js'; const countriesInfo = service.getCountriesInfo(); const energySources = service.getEnergySources(); const types = ['line', 'stackedline', 'fullstackedline']; const seriesTypeLabel = { 'aria-label': 'Series Type' }; function App() { const [type, setType] = useState(types[0]); const handleChange = useCallback((e) => { setType(e.value); }, []); return ( <React.Fragment> <Chart palette="Violet" dataSource={countriesInfo} > <CommonSeriesSettings argumentField="country" type={type} /> {energySources.map((item) => ( <Series key={item.value} valueField={item.value} name={item.name} /> ))} <Margin bottom={20} /> <ArgumentAxis valueMarginsEnabled={false} discreteAxisDivisionMode="crossLabels" > <Grid visible={true} /> </ArgumentAxis> <Legend verticalAlignment="bottom" horizontalAlignment="center" itemTextPosition="bottom" /> <Export enabled={true} /> <Title text="Energy Consumption in 2004"> <Subtitle text="(Millions of Tons, Oil Equivalent)" /> </Title> <Tooltip enabled={true} /> </Chart> <div className="options"> <div className="caption">Options</div> <div className="option"> <span>Series Type </span> <SelectBox dataSource={types} inputAttr={seriesTypeLabel} value={type} onValueChanged={handleChange} /> </div> </div> </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 energySources = [ { value: 'hydro', name: 'Hydro-electric' }, { value: 'oil', name: 'Oil' }, { value: 'gas', name: 'Natural gas' }, { value: 'coal', name: 'Coal' }, { value: 'nuclear', name: 'Nuclear' }, ]; const countriesInfo = [{ country: 'USA', hydro: 71.2, oil: 910.4, gas: 483.2, coal: 564.3, nuclear: 216.1, }, { country: 'China', hydro: 72.5, oil: 223.6, gas: 36, coal: 956.9, nuclear: 11.3, }, { country: 'Russia', hydro: 47.7, oil: 149.4, gas: 432.3, coal: 105, nuclear: 29.3, }, { country: 'Japan', hydro: 17.9, oil: 283.6, gas: 61.8, coal: 120.8, nuclear: 52.8, }, { country: 'India', hydro: 14.4, oil: 86.4, gas: 25.1, coal: 204.8, nuclear: 3.8, }, { country: 'Germany', hydro: 6.6, oil: 101.7, gas: 92.7, coal: 85.7, nuclear: 30.8, }]; export default { getEnergySources() { return energySources; }, getCountriesInfo() { return countriesInfo; }, };
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 energySources = [ { value: 'hydro', name: 'Hydro-electric' }, { value: 'oil', name: 'Oil' }, { value: 'gas', name: 'Natural gas' }, { value: 'coal', name: 'Coal' }, { value: 'nuclear', name: 'Nuclear' }, ]; const countriesInfo = [ { country: 'USA', hydro: 71.2, oil: 910.4, gas: 483.2, coal: 564.3, nuclear: 216.1, }, { country: 'China', hydro: 72.5, oil: 223.6, gas: 36, coal: 956.9, nuclear: 11.3, }, { country: 'Russia', hydro: 47.7, oil: 149.4, gas: 432.3, coal: 105, nuclear: 29.3, }, { country: 'Japan', hydro: 17.9, oil: 283.6, gas: 61.8, coal: 120.8, nuclear: 52.8, }, { country: 'India', hydro: 14.4, oil: 86.4, gas: 25.1, coal: 204.8, nuclear: 3.8, }, { country: 'Germany', hydro: 6.6, oil: 101.7, gas: 92.7, coal: 85.7, nuclear: 30.8, }, ]; export default { getEnergySources() { return energySources; }, getCountriesInfo() { return countriesInfo; }, };
<!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>
.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: 10px; } .option > .dx-widget { display: inline-block; vertical-align: middle; }