If you have technical questions, please create a support ticket in the DevExpress Support Center.
import React from 'react';
import {
Chart, Series, CommonSeriesSettings, Legend, ValueAxis, Title, Export, Tooltip,
} from 'devextreme-react/chart';
import service from './data.ts';
const dataSource = service.getMaleAgeData();
function customizeTooltip(arg: { seriesName: string; valueText: string; }) {
return {
text: `${arg.seriesName} years: ${arg.valueText}`,
};
}
function App() {
return (
<Chart
id="chart"
title="Male Age Structure"
dataSource={dataSource}
>
<CommonSeriesSettings argumentField="state" type="stackedbar" />
<Series
valueField="young"
name="0-14"
/>
<Series
valueField="middle"
name="15-64"
/>
<Series
valueField="older"
name="65 and older"
/>
<ValueAxis position="right">
<Title text="millions" />
</ValueAxis>
<Legend
verticalAlignment="bottom"
horizontalAlignment="center"
itemTextPosition="top"
/>
<Export enabled={true} />
<Tooltip
enabled={true}
location="edge"
customizeTooltip={customizeTooltip}
/>
</Chart>
);
}
export default App;
xxxxxxxxxx
import React from 'react';
import {
Chart,
Series,
CommonSeriesSettings,
Legend,
ValueAxis,
Title,
Export,
Tooltip,
} from 'devextreme-react/chart';
import service from './data.js';
const dataSource = service.getMaleAgeData();
function customizeTooltip(arg) {
return {
text: `${arg.seriesName} years: ${arg.valueText}`,
};
}
function App() {
return (
<Chart
id="chart"
title="Male Age Structure"
dataSource={dataSource}
>
<CommonSeriesSettings
argumentField="state"
type="stackedbar"
/>
<Series
valueField="young"
name="0-14"
/>
<Series
valueField="middle"
name="15-64"
/>
<Series
valueField="older"
name="65 and older"
/>
<ValueAxis position="right">
<Title text="millions" />
</ValueAxis>
<Legend
verticalAlignment="bottom"
horizontalAlignment="center"
itemTextPosition="top"
/>
<Export enabled={true} />
<Tooltip
enabled={true}
location="edge"
customizeTooltip={customizeTooltip}
/>
</Chart>
);
}
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 maleAgeData = [{
state: 'Germany',
young: 5.3,
middle: 26,
older: 8,
}, {
state: 'Japan',
young: 6.45,
middle: 30.5,
older: 11.22,
}, {
state: 'Russia',
young: 12.56,
middle: 45.5,
older: 6.5,
}, {
state: 'USA',
young: 32,
middle: 87,
older: 15,
}];
export default {
getMaleAgeData() {
return maleAgeData;
},
};
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@link:../../packages/devextreme/artifacts/npm/devextreme/cjs',
'devextreme-react': 'npm:devextreme-react@link:../../packages/devextreme-react/npm/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 maleAgeData = [
{
state: 'Germany',
young: 5.3,
middle: 26,
older: 8,
},
{
state: 'Japan',
young: 6.45,
middle: 30.5,
older: 11.22,
},
{
state: 'Russia',
young: 12.56,
middle: 45.5,
older: 6.5,
},
{
state: 'USA',
young: 32,
middle: 87,
older: 15,
},
];
export default {
getMaleAgeData() {
return maleAgeData;
},
};
xxxxxxxxxx
<html lang="en">
<head></head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"></div>
</div>
</body>
</html>
xxxxxxxxxx
#chart {
height: 440px;
}
Bind to Data
In this demo, series is bound to data directly. See the Bind Series to Data article for information. The "state" field name is assigned to the argumentField property of the commonSeriesSettings object since the stacked bar chart contains series with the same argument field.
Specify Common Series Settings
To configure settings for all series in the chart, use the commonSeriesSettings object. For example, specify the series type.
Customize Stacked Bar Chart
Use the verticalAlignment and horizontalAlignment properties of the legend object to specify the legend position in the chart. You can specify the text's position relative to the marker in a legend item in the itemTextPosition property.
To configure tooltips in the chart, use the tooltip object. To enable the tooltips, assign true to the enabled property of this object. If you want to customize a specific tooltip, assign a function to the customizeTooltip property. In this demo, the function returns the tooltip's text that shows the series name and point value.