DevExtreme v25.1 is now available.

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

Your search did not match any results.

React Charts - Point Image

DevExtreme Chart can display custom images for series points. Specify the point.image object within common series or series settings to display these images.

Backend API
import React from 'react'; import { Chart, CommonSeriesSettings, Series, ArgumentAxis, Grid, Label, Format, ValueAxis, Export, Legend, Point, IExportProps, } from 'devextreme-react/chart'; import { iceHockeyStatistics } from './data.ts'; const exportFormats: IExportProps['formats'] = ['PNG', 'PDF', 'JPEG', 'GIF', 'SVG']; function customizePoint(e: { value: number; }) { if (e.value === 1) { return { image: { url: '../../../../images/Charts/PointImage/icon-medal-gold.png', width: 20, height: 20 }, visible: true }; } if (e.value === 2) { return { image: { url: '../../../../images/Charts/PointImage/icon-medal-silver.png', width: 20, height: 20 }, visible: true }; } if (e.value === 3) { return { image: { url: '../../../../images/Charts/PointImage/icon-medal-bronse.png', width: 20, height: 20 }, visible: true }; } return null; } function customizeText(e: { valueText: string; }) { if (e.valueText === '1') { return `${e.valueText}st place`; } if (e.valueText === '2') { return `${e.valueText}nd place`; } if (e.valueText === '3') { return `${e.valueText}rd place`; } return `${e.valueText}th place`; } function App() { return ( <Chart id="chart" dataSource={iceHockeyStatistics} title={'Canadian Men’s National Ice Hockey Team\n at the World Championships'} customizePoint={customizePoint} > <CommonSeriesSettings argumentField="year" valueField="place" type="spline" > <Point visible={false} /> </CommonSeriesSettings> <Series color="#888888" /> <ArgumentAxis allowDecimals={false} axisDivisionFactor={60} > <Grid visible={true} /> <Label> <Format type="decimal" /> </Label> </ArgumentAxis> <ValueAxis inverted={true}> <Grid visible={false} /> <Label customizeText={customizeText} /> </ValueAxis> <Export enabled={true} formats={exportFormats} /> <Legend visible={false} /> </Chart> ); } export default App;
import React from 'react'; import { Chart, CommonSeriesSettings, Series, ArgumentAxis, Grid, Label, Format, ValueAxis, Export, Legend, Point, } from 'devextreme-react/chart'; import { iceHockeyStatistics } from './data.js'; const exportFormats = ['PNG', 'PDF', 'JPEG', 'GIF', 'SVG']; function customizePoint(e) { if (e.value === 1) { return { image: { url: '../../../../images/Charts/PointImage/icon-medal-gold.png', width: 20, height: 20, }, visible: true, }; } if (e.value === 2) { return { image: { url: '../../../../images/Charts/PointImage/icon-medal-silver.png', width: 20, height: 20, }, visible: true, }; } if (e.value === 3) { return { image: { url: '../../../../images/Charts/PointImage/icon-medal-bronse.png', width: 20, height: 20, }, visible: true, }; } return null; } function customizeText(e) { if (e.valueText === '1') { return `${e.valueText}st place`; } if (e.valueText === '2') { return `${e.valueText}nd place`; } if (e.valueText === '3') { return `${e.valueText}rd place`; } return `${e.valueText}th place`; } function App() { return ( <Chart id="chart" dataSource={iceHockeyStatistics} title={'Canadian Men’s National Ice Hockey Team\n at the World Championships'} customizePoint={customizePoint} > <CommonSeriesSettings argumentField="year" valueField="place" type="spline" > <Point visible={false} /> </CommonSeriesSettings> <Series color="#888888" /> <ArgumentAxis allowDecimals={false} axisDivisionFactor={60} > <Grid visible={true} /> <Label> <Format type="decimal" /> </Label> </ArgumentAxis> <ValueAxis inverted={true}> <Grid visible={false} /> <Label customizeText={customizeText} /> </ValueAxis> <Export enabled={true} formats={exportFormats} /> <Legend visible={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 const iceHockeyStatistics = [{ year: 1977, place: 4, }, { year: 1978, place: 3, }, { year: 1979, place: 4, }, { year: 1981, place: 4, }, { year: 1982, place: 3, }, { year: 1983, place: 3, }, { year: 1985, place: 2, }, { year: 1986, place: 3, }, { year: 1987, place: 4, }, { year: 1989, place: 2, }, { year: 1990, place: 4, }, { year: 1991, place: 2, }, { year: 1992, place: 8, }, { year: 1993, place: 4, }, { year: 1994, place: 1, }, { year: 1995, place: 3, }, { year: 1996, place: 2, }, { year: 1997, place: 1, }, { year: 1998, place: 6, }, { year: 1999, place: 4, }, { year: 2000, place: 4, }, { year: 2001, place: 5, }, { year: 2002, place: 6, }, { year: 2003, place: 1, }, { year: 2004, place: 1, }, { year: 2005, place: 2, }, { year: 2006, place: 4, }, { year: 2007, place: 1, }, { year: 2008, place: 2, }, { year: 2009, place: 2, }, { year: 2010, place: 7, }, { year: 2011, place: 5, }, { year: 2012, place: 5, }, { year: 2013, place: 5, }];
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://cdn.jsdelivr.net/npm/', '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@25.1.5/cjs', 'devextreme-react': 'npm:devextreme-react@25.1.5/cjs', 'devextreme-quill': 'npm:devextreme-quill@1.7.4/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.21/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.64/dist/dx-gantt.js', 'inferno': 'npm:inferno@8.2.3/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@8.2.3/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', '@preact/signals-core': 'npm:@preact/signals-core@1.8.0/dist/signals-core.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-react/common': { main: 'index.js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/common/core/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', ], babelOptions: { sourceMaps: false, stage0: true, react: true, }, }; System.config(window.config); // eslint-disable-next-line const useTgzInCSB = ['openai'];
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
export const iceHockeyStatistics = [ { year: 1977, place: 4, }, { year: 1978, place: 3, }, { year: 1979, place: 4, }, { year: 1981, place: 4, }, { year: 1982, place: 3, }, { year: 1983, place: 3, }, { year: 1985, place: 2, }, { year: 1986, place: 3, }, { year: 1987, place: 4, }, { year: 1989, place: 2, }, { year: 1990, place: 4, }, { year: 1991, place: 2, }, { year: 1992, place: 8, }, { year: 1993, place: 4, }, { year: 1994, place: 1, }, { year: 1995, place: 3, }, { year: 1996, place: 2, }, { year: 1997, place: 1, }, { year: 1998, place: 6, }, { year: 1999, place: 4, }, { year: 2000, place: 4, }, { year: 2001, place: 5, }, { year: 2002, place: 6, }, { year: 2003, place: 1, }, { year: 2004, place: 1, }, { year: 2005, place: 2, }, { year: 2006, place: 4, }, { year: 2007, place: 1, }, { year: 2008, place: 2, }, { year: 2009, place: 2, }, { year: 2010, place: 7, }, { year: 2011, place: 5, }, { year: 2012, place: 5, }, { year: 2013, place: 5, }, ];
<!DOCTYPE html> <html lang="en"> <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=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/25.1.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://cdn.jsdelivr.net/npm/core-js@2.6.12/client/shim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/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; }

This demo hides default point symbols and calls the customizePoint function to display images (based on point values).