If you have technical questions, please create a support ticket in the DevExpress Support Center.
import React, { useCallback } from 'react';
import {
Chart,
Series,
Legend,
ValueAxis,
VisualRange,
Label,
ConstantLine,
Export,
} from 'devextreme-react/chart';
import { temperaturesData } from './data.ts';
const highAverage = 77;
const lowAverage = 58;
function customizeText(arg: { valueText: string; }) {
return `${arg.valueText}°F`;
}
function App() {
const customizePoint = useCallback((arg: { value: number; }) => {
if (arg.value > highAverage) {
return { color: '#ff7c7c', hoverStyle: { color: '#ff7c7c' } };
}
if (arg.value < lowAverage) {
return { color: '#8c8cff', hoverStyle: { color: '#8c8cff' } };
}
return null;
}, []);
const customizeLabel = useCallback((arg: { value: number; }) => {
if (arg.value > highAverage) {
return {
visible: true,
backgroundColor: '#ff7c7c',
customizeText(e) {
return `${e.valueText}°F`;
},
};
}
return null;
}, []);
return (
<Chart
id="chart"
title="Daily Temperature in May"
dataSource={temperaturesData}
customizePoint={customizePoint}
customizeLabel={customizeLabel}
>
<Series
argumentField="day"
valueField="value"
type="bar"
color="#e7d19a"
/>
<ValueAxis maxValueMargin={0.01}>
<VisualRange startValue={40} />
<Label customizeText={customizeText} />
<ConstantLine
width={2}
value={lowAverage}
color="#8c8cff"
dashStyle="dash"
>
<Label text="Low Average" />
</ConstantLine>
<ConstantLine
width={2}
value={highAverage}
color="#ff7c7c"
dashStyle="dash"
>
<Label text="High Average" />
</ConstantLine>
</ValueAxis>
<Legend visible={false} />
<Export enabled={true} />
</Chart>
);
}
export default App;
xxxxxxxxxx
import React, { useCallback } from 'react';
import {
Chart,
Series,
Legend,
ValueAxis,
VisualRange,
Label,
ConstantLine,
Export,
} from 'devextreme-react/chart';
import { temperaturesData } from './data.js';
const highAverage = 77;
const lowAverage = 58;
function customizeText(arg) {
return `${arg.valueText}°F`;
}
function App() {
const customizePoint = useCallback((arg) => {
if (arg.value > highAverage) {
return { color: '#ff7c7c', hoverStyle: { color: '#ff7c7c' } };
}
if (arg.value < lowAverage) {
return { color: '#8c8cff', hoverStyle: { color: '#8c8cff' } };
}
return null;
}, []);
const customizeLabel = useCallback((arg) => {
if (arg.value > highAverage) {
return {
visible: true,
backgroundColor: '#ff7c7c',
customizeText(e) {
return `${e.valueText}°F`;
},
};
}
return null;
}, []);
return (
<Chart
id="chart"
title="Daily Temperature in May"
dataSource={temperaturesData}
customizePoint={customizePoint}
customizeLabel={customizeLabel}
>
<Series
argumentField="day"
valueField="value"
type="bar"
color="#e7d19a"
/>
<ValueAxis maxValueMargin={0.01}>
<VisualRange startValue={40} />
<Label customizeText={customizeText} />
<ConstantLine
width={2}
value={lowAverage}
color="#8c8cff"
dashStyle="dash"
>
<Label text="Low Average" />
</ConstantLine>
<ConstantLine
width={2}
value={highAverage}
color="#ff7c7c"
dashStyle="dash"
>
<Label text="High Average" />
</ConstantLine>
</ValueAxis>
<Legend visible={false} />
<Export enabled={true} />
</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 temperaturesData = [{
day: '1',
value: 57,
}, {
day: '2',
value: 58,
}, {
day: '3',
value: 57,
}, {
day: '4',
value: 59,
}, {
day: '5',
value: 63,
}, {
day: '6',
value: 63,
}, {
day: '7',
value: 63,
}, {
day: '8',
value: 64,
}, {
day: '9',
value: 64,
}, {
day: '10',
value: 64,
}, {
day: '11',
value: 69,
}, {
day: '12',
value: 72,
}, {
day: '13',
value: 75,
}, {
day: '14',
value: 78,
}, {
day: '15',
value: 76,
}, {
day: '16',
value: 70,
}, {
day: '17',
value: 65,
}, {
day: '18',
value: 65,
}, {
day: '19',
value: 68,
}, {
day: '20',
value: 70,
}, {
day: '21',
value: 73,
}, {
day: '22',
value: 73,
}, {
day: '23',
value: 75,
}, {
day: '24',
value: 78,
}, {
day: '25',
value: 76,
}, {
day: '26',
value: 76,
}, {
day: '27',
value: 80,
}, {
day: '28',
value: 76,
}, {
day: '29',
value: 75,
}, {
day: '30',
value: 75,
}, {
day: '31',
value: 74,
}];
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 temperaturesData = [
{
day: '1',
value: 57,
},
{
day: '2',
value: 58,
},
{
day: '3',
value: 57,
},
{
day: '4',
value: 59,
},
{
day: '5',
value: 63,
},
{
day: '6',
value: 63,
},
{
day: '7',
value: 63,
},
{
day: '8',
value: 64,
},
{
day: '9',
value: 64,
},
{
day: '10',
value: 64,
},
{
day: '11',
value: 69,
},
{
day: '12',
value: 72,
},
{
day: '13',
value: 75,
},
{
day: '14',
value: 78,
},
{
day: '15',
value: 76,
},
{
day: '16',
value: 70,
},
{
day: '17',
value: 65,
},
{
day: '18',
value: 65,
},
{
day: '19',
value: 68,
},
{
day: '20',
value: 70,
},
{
day: '21',
value: 73,
},
{
day: '22',
value: 73,
},
{
day: '23',
value: 75,
},
{
day: '24',
value: 78,
},
{
day: '25',
value: 76,
},
{
day: '26',
value: 76,
},
{
day: '27',
value: 80,
},
{
day: '28',
value: 76,
},
{
day: '29',
value: 75,
},
{
day: '30',
value: 75,
},
{
day: '31',
value: 74,
},
];
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;
}
Customize Points
Use the customizePoint function to change the appearance of individual series points. This function should return an object with properties that you want to change in a point configuration. This demo uses this function to color all points with values above the "High Average" in red, and points with values below the "Low Average" in blue.
Customize Labels
To customize the appearance of individual point labels, implement the customizeLabel function. This function should also return an object with properties that need to be changed for a certain label. This demo specifies custom labels for the red points.
Create Constant Lines
To create constant lines, follow the steps below:
-
Choose a direction for the line. You can specify horizontal lines in the valueAxis object, and vertical - in the argumentAxis object.
-
Specify the constantLines object. In this object, declare an object for each line with the properties you want to change.
Note that it's necessary to specify the value property for the line to display correctly.