DevExtreme v23.2 is now available.

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

Your search did not match any results.

Timeline Chart

Timeline charts represent events in chronological order.

The exact timeline chart implementation steps depend on the data source. Below are general recommendations on how to create a timeline chart.  

  • Choose a series type
    Each event is represented by its name and start/end dates. In this case, the series type should have points with one argument and two values, for example, the Range Bar.

  • Bind the series to data
    You can bind the series to data directly or use a series template (depending on the data source). These approaches and their differences are described in the Bind Series to Data article. In this demo, we use a series template.

  • Line up bars
    Specify the barOverlapGroup to arrange bars in a line that displays a combined timeline.

  • Rotate the chart
    A range bar chart's bars are vertical. To make them horizontal, set the rotated property to true.

  • Sort the events chronologically
    Arguments maintain objects' order in the data source. If this order is not chronological, use the axis' categories array to specify the order.

https://en.wikipedia.org
Backend API
import React from 'react'; import { Chart, CommonSeriesSettings, Legend, SeriesTemplate, Animation, ArgumentAxis, Tick, Title, } from 'devextreme-react/chart'; import dataSource from './data.ts'; const axisCategories = ['Royal Houses']; function App() { return ( <Chart id="chart" dataSource={dataSource} barGroupPadding={0.2} rotated={true}> <ArgumentAxis categories={axisCategories}> <Tick visible={false} /> </ArgumentAxis> <Title text="The British Monarchy" subtitle="An Abbreviated Timeline" /> <CommonSeriesSettings type="rangebar" argumentField="monarch" rangeValue1Field="start" rangeValue2Field="end" barOverlapGroup="monarch" minBarSize={4} ></CommonSeriesSettings> <Legend verticalAlignment="bottom" horizontalAlignment="center"> <Title text="Royal Houses" /> </Legend> <SeriesTemplate nameField="house" /> <Animation enabled={false} /> </Chart> ); } export default App;
import React from 'react'; import { Chart, CommonSeriesSettings, Legend, SeriesTemplate, Animation, ArgumentAxis, Tick, Title, } from 'devextreme-react/chart'; import dataSource from './data.js'; const axisCategories = ['Royal Houses']; function App() { return ( <Chart id="chart" dataSource={dataSource} barGroupPadding={0.2} rotated={true} > <ArgumentAxis categories={axisCategories}> <Tick visible={false} /> </ArgumentAxis> <Title text="The British Monarchy" subtitle="An Abbreviated Timeline" /> <CommonSeriesSettings type="rangebar" argumentField="monarch" rangeValue1Field="start" rangeValue2Field="end" barOverlapGroup="monarch" minBarSize={4} ></CommonSeriesSettings> <Legend verticalAlignment="bottom" horizontalAlignment="center" > <Title text="Royal Houses" /> </Legend> <SeriesTemplate nameField="house" /> <Animation enabled={false} /> </Chart> ); } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
export default [ { monarch: 'Anne', start: new Date(1701, 4, 1), end: new Date(1714, 7, 1), house: 'Stuart', }, { monarch: 'George I', start: new Date(1714, 7, 1), house: 'Hanover', end: new Date(1727, 5, 11), }, { monarch: 'George II', start: new Date(1727, 5, 11), house: 'Hanover', end: new Date(1760, 9, 25), }, { monarch: 'George III', start: new Date(1760, 9, 25), house: 'Hanover', end: new Date(1820, 0, 29), }, { monarch: 'George IV', start: new Date(1820, 0, 29), house: 'Hanover', end: new Date(1830, 5, 26), }, { monarch: 'William IV', start: new Date(1830, 5, 26), house: 'Hanover', end: new Date(1837, 5, 20), }, { monarch: 'Victoria', start: new Date(1837, 5, 20), end: new Date(1901, 0, 22), house: 'Hanover', }, { monarch: 'Edward VII', start: new Date(1901, 0, 22), house: 'Saxe-Coburg and Gotha', end: new Date(1910, 4, 6), }, { monarch: 'George V', start: new Date(1910, 4, 6), house: 'Saxe-Coburg and Gotha', end: new Date(1917, 5, 17), }, { monarch: 'George V', start: new Date(1917, 5, 17), house: 'Windsor', end: new Date(1936, 0, 20), }, { monarch: 'Edward VIII', start: new Date(1936, 0, 20), house: 'Windsor', end: new Date(1936, 11, 11), }, { monarch: 'George VI', start: new Date(1936, 11, 11), house: 'Windsor', end: new Date(1952, 1, 6), }, { monarch: 'Elizabeth II', house: 'Windsor', start: new Date(1952, 1, 6), end: new Date(2022, 8, 8), }, { monarch: 'Charles III', house: 'Windsor', start: new Date(2022, 8, 8), end: new Date(), }, { house: 'Stuart', start: new Date(1701, 4, 1), end: new Date(1714, 7, 1), monarch: 'Royal Houses', }, { end: new Date(1901, 0, 22), house: 'Hanover', start: new Date(1714, 7, 1), monarch: 'Royal Houses', }, { start: new Date(1901, 0, 22), end: new Date(1917, 5, 17), house: 'Saxe-Coburg and Gotha', monarch: 'Royal Houses', }, { house: 'Windsor', start: new Date(1917, 5, 17), end: new Date(), monarch: 'Royal Houses', }, ];
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'));
export default [ { monarch: 'Anne', start: new Date(1701, 4, 1), end: new Date(1714, 7, 1), house: 'Stuart', }, { monarch: 'George I', start: new Date(1714, 7, 1), house: 'Hanover', end: new Date(1727, 5, 11), }, { monarch: 'George II', start: new Date(1727, 5, 11), house: 'Hanover', end: new Date(1760, 9, 25), }, { monarch: 'George III', start: new Date(1760, 9, 25), house: 'Hanover', end: new Date(1820, 0, 29), }, { monarch: 'George IV', start: new Date(1820, 0, 29), house: 'Hanover', end: new Date(1830, 5, 26), }, { monarch: 'William IV', start: new Date(1830, 5, 26), house: 'Hanover', end: new Date(1837, 5, 20), }, { monarch: 'Victoria', start: new Date(1837, 5, 20), end: new Date(1901, 0, 22), house: 'Hanover', }, { monarch: 'Edward VII', start: new Date(1901, 0, 22), house: 'Saxe-Coburg and Gotha', end: new Date(1910, 4, 6), }, { monarch: 'George V', start: new Date(1910, 4, 6), house: 'Saxe-Coburg and Gotha', end: new Date(1917, 5, 17), }, { monarch: 'George V', start: new Date(1917, 5, 17), house: 'Windsor', end: new Date(1936, 0, 20), }, { monarch: 'Edward VIII', start: new Date(1936, 0, 20), house: 'Windsor', end: new Date(1936, 11, 11), }, { monarch: 'George VI', start: new Date(1936, 11, 11), house: 'Windsor', end: new Date(1952, 1, 6), }, { monarch: 'Elizabeth II', house: 'Windsor', start: new Date(1952, 1, 6), end: new Date(2022, 8, 8), }, { monarch: 'Charles III', house: 'Windsor', start: new Date(2022, 8, 8), end: new Date(), }, { house: 'Stuart', start: new Date(1701, 4, 1), end: new Date(1714, 7, 1), monarch: 'Royal Houses', }, { end: new Date(1901, 0, 22), house: 'Hanover', start: new Date(1714, 7, 1), monarch: 'Royal Houses', }, { start: new Date(1901, 0, 22), end: new Date(1917, 5, 17), house: 'Saxe-Coburg and Gotha', monarch: 'Royal Houses', }, { house: 'Windsor', start: new Date(1917, 5, 17), end: new Date(), monarch: 'Royal Houses', }, ];
<!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>
#chart { height: 440px; }