If you have technical questions, please create a support ticket in the DevExpress Support Center.
import React from 'react';
import Chart, {
CommonSeriesSettings,
Series,
ValueAxis,
Export,
Legend,
Tooltip,
Title,
Grid,
Format,
} from 'devextreme-react/chart';
import { continentSources, populationData } from './data.ts';
const customizeTooltip = (pointInfo) => {
const items = pointInfo.valueText.split('\n');
const color = pointInfo.point.getColor();
items.forEach((item, index) => {
if (item.indexOf(pointInfo.seriesName) === 0) {
const element = document.createElement('span');
element.textContent = item;
element.style.color = color;
element.className = 'active';
items[index] = element.outerHTML;
}
});
return { text: items.join('\n') };
};
function App() {
return (
<Chart
id="chart"
palette="Vintage"
dataSource={populationData}
>
<CommonSeriesSettings
argumentField="year"
type="fullstackedbar"
/>
{
continentSources.map((item) => <Series
key={item.value}
valueField={item.value}
name={item.name} />)
}
<Series
axis="total"
type="spline"
valueField="total"
name="Total"
color="#008fd8"
/>
<ValueAxis>
<Grid visible={true} />
</ValueAxis>
<ValueAxis
name="total"
position="right"
title="Total Population, billions"
>
<Grid visible={true} />
</ValueAxis>
<Legend
verticalAlignment="bottom"
horizontalAlignment="center"
/>
<Export enabled={true} />
<Tooltip
enabled={true}
shared={true}
customizeTooltip={customizeTooltip}
>
<Format
type="largeNumber"
precision={1}
/>
</Tooltip>
<Title text="Evolution of Population by Continent" />
</Chart>
);
}
export default App;
xxxxxxxxxx
import React from 'react';
import Chart, {
CommonSeriesSettings,
Series,
ValueAxis,
Export,
Legend,
Tooltip,
Title,
Grid,
Format,
} from 'devextreme-react/chart';
import { continentSources, populationData } from './data.js';
const customizeTooltip = (pointInfo) => {
const items = pointInfo.valueText.split('\n');
const color = pointInfo.point.getColor();
items.forEach((item, index) => {
if (item.indexOf(pointInfo.seriesName) === 0) {
const element = document.createElement('span');
element.textContent = item;
element.style.color = color;
element.className = 'active';
items[index] = element.outerHTML;
}
});
return { text: items.join('\n') };
};
function App() {
return (
<Chart
id="chart"
palette="Vintage"
dataSource={populationData}
>
<CommonSeriesSettings
argumentField="year"
type="fullstackedbar"
/>
{continentSources.map((item) => (
<Series
key={item.value}
valueField={item.value}
name={item.name}
/>
))}
<Series
axis="total"
type="spline"
valueField="total"
name="Total"
color="#008fd8"
/>
<ValueAxis>
<Grid visible={true} />
</ValueAxis>
<ValueAxis
name="total"
position="right"
title="Total Population, billions"
>
<Grid visible={true} />
</ValueAxis>
<Legend
verticalAlignment="bottom"
horizontalAlignment="center"
/>
<Export enabled={true} />
<Tooltip
enabled={true}
shared={true}
customizeTooltip={customizeTooltip}
>
<Format
type="largeNumber"
precision={1}
/>
</Tooltip>
<Title text="Evolution of Population by Continent" />
</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
export const continentSources = [
{ value: 'africa', name: 'Africa' },
{ value: 'asia', name: 'Asia' },
{ value: 'europe', name: 'Europe' },
{ value: 'latinamerica', name: 'Latin America & Caribbean' },
{ value: 'northamerica', name: 'Northern America' },
{ value: 'oceania', name: 'Oceania' },
];
export const populationData = [{
year: '1750',
africa: 106000000,
asia: 502000000,
europe: 163000000,
latinamerica: 16000000,
northamerica: 2000000,
oceania: 2000000,
total: 791000000,
}, {
year: '1800',
africa: 107000000,
asia: 635000000,
europe: 203000000,
latinamerica: 24000000,
northamerica: 7000000,
oceania: 2000000,
total: 978000000,
}, {
year: '1850',
africa: 111000000,
asia: 809000000,
europe: 276000000,
latinamerica: 38000000,
northamerica: 26000000,
oceania: 2000000,
total: 1262000000,
}, {
year: '1900',
africa: 133000000,
asia: 947000000,
europe: 408000000,
latinamerica: 74000000,
northamerica: 82000000,
oceania: 6000000,
total: 1650000000,
}, {
year: '1950',
africa: 229895000,
asia: 1403388000,
europe: 547287000,
latinamerica: 167368000,
northamerica: 171614000,
oceania: 12675000,
total: 2532227000,
}, {
year: '2000',
africa: 811101000,
asia: 3719044000,
europe: 726777000,
latinamerica: 521419000,
northamerica: 313289000,
oceania: 31130000,
total: 6122770000,
}, {
year: '2050',
africa: 2191599000,
asia: 5142220000,
europe: 719257000,
latinamerica: 750956000,
northamerica: 446862000,
oceania: 55223000,
total: 9306128000,
}];
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
export const continentSources = [
{ value: 'africa', name: 'Africa' },
{ value: 'asia', name: 'Asia' },
{ value: 'europe', name: 'Europe' },
{ value: 'latinamerica', name: 'Latin America & Caribbean' },
{ value: 'northamerica', name: 'Northern America' },
{ value: 'oceania', name: 'Oceania' },
];
export const populationData = [
{
year: '1750',
africa: 106000000,
asia: 502000000,
europe: 163000000,
latinamerica: 16000000,
northamerica: 2000000,
oceania: 2000000,
total: 791000000,
},
{
year: '1800',
africa: 107000000,
asia: 635000000,
europe: 203000000,
latinamerica: 24000000,
northamerica: 7000000,
oceania: 2000000,
total: 978000000,
},
{
year: '1850',
africa: 111000000,
asia: 809000000,
europe: 276000000,
latinamerica: 38000000,
northamerica: 26000000,
oceania: 2000000,
total: 1262000000,
},
{
year: '1900',
africa: 133000000,
asia: 947000000,
europe: 408000000,
latinamerica: 74000000,
northamerica: 82000000,
oceania: 6000000,
total: 1650000000,
},
{
year: '1950',
africa: 229895000,
asia: 1403388000,
europe: 547287000,
latinamerica: 167368000,
northamerica: 171614000,
oceania: 12675000,
total: 2532227000,
},
{
year: '2000',
africa: 811101000,
asia: 3719044000,
europe: 726777000,
latinamerica: 521419000,
northamerica: 313289000,
oceania: 31130000,
total: 6122770000,
},
{
year: '2050',
africa: 2191599000,
asia: 5142220000,
europe: 719257000,
latinamerica: 750956000,
northamerica: 446862000,
oceania: 55223000,
total: 9306128000,
},
];
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;
}
.active {
font-weight: 500;
}
To configure a multi-axis chart, follow the steps below:
-
Create and name value axes. Declare multiple objects in the valueAxis array. Each object configures a value axis. Every value axis should have a unique name.
-
Bind series to value axes.
Assign the name of an axis to the series.axis property. If leave the series.axis property unspecified, the series is bound to the axis declared first in the valueAxis array.
In this demo, the first axis is declared without a name and is bound to the first series. The name of the second axis is total
and it is bound to the spline series. The position of the second axis is right
.