If you have technical questions, please create a support ticket in the DevExpress Support Center.
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;
xxxxxxxxxx
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;
xxxxxxxxxx
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.tsx';
ReactDOM.render(
<App />,
document.getElementById('app'),
);
xxxxxxxxxx
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;
},
};
xxxxxxxxxx
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,
},
'openai': {
'esModule': true,
},
},
paths: {
'npm:': 'https://unpkg.com/',
'bundles:': 'bundles/',
'externals:': 'bundles/externals/',
},
defaultExtension: 'js',
map: {
'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js',
'typescript': 'npm:typescript@4.2.4/lib/typescript.js',
'jszip': 'npm:jszip@3.10.1/dist/jszip.min.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/prop-types.js',
'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js',
'luxon': 'npm:luxon@3.4.4/build/global/luxon.min.js',
'es6-object-assign': 'npm:es6-object-assign',
'devextreme': 'npm:devextreme@24.2.5/cjs',
'devextreme-react': 'npm:devextreme-react@24.2.5/cjs',
'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js',
'devexpress-diagram': 'npm:devexpress-diagram@2.2.5/dist/dx-diagram.js',
'devexpress-gantt': 'npm:devexpress-gantt@4.1.54/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/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.8/standalone.js',
'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js',
},
packages: {
'devextreme': {
defaultExtension: 'js',
},
'devextreme-react': {
main: 'index.js',
},
'devextreme/events/utils': {
main: 'index',
},
'devextreme/localization/messages': {
format: 'json',
defaultExtension: 'json',
},
'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);
xxxxxxxxxx
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.js';
ReactDOM.render(<App />, document.getElementById('app'));
xxxxxxxxxx
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;
},
};
xxxxxxxxxx
<html lang="en">
<head></head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"></div>
</div>
</body>
</html>
xxxxxxxxxx
.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;
}
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.