DevExtreme v24.2 is now available.

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

Your search did not match any results.

React Vector Map - Palette

This demo shows how to color specific map areas using a palette. In the VectorMap component, a palette defines a range of colors that are used to paint areas. This range is divided into segments using the value assigned to the colorGroups property. Each segment contributes a color into an array of colors.

The map in this demo represents the top 40 countries by population. Map areas are colored according to the percentage of population.

Backend API
import React from 'react'; import VectorMap, { ILayerProps, ILegendProps, ITooltipProps, Layer, Legend, Source, Tooltip, } from 'devextreme-react/vector-map'; import * as mapsData from 'devextreme-dist/js/vectormap-data/world.js'; import { populations } from './data.ts'; const colorGroups = [0, 0.5, 0.8, 1, 2, 3, 100]; const bounds = [-180, 85, 180, -60]; const customizeLayer: ILayerProps['customize'] = (elements) => { elements.forEach((element) => { element.attribute('population', populations[element.attribute('name')]); }); }; const customizeText: ILegendProps['customizeText'] = (arg) => { let text; if (arg.index === 0) { text = '< 0.5%'; } else if (arg.index === 5) { text = '> 3%'; } else { text = `${arg.start}% to ${arg.end}%`; } return text; }; const customizeTooltip: ITooltipProps['customizeTooltip'] = (arg) => { if (arg.attribute('population')) { return { text: `${arg.attribute('name')}: ${arg.attribute('population')}% of world population` }; } return null; }; export default function App() { return ( <VectorMap id="vector-map" bounds={bounds}> <Layer dataSource={mapsData.world} palette="Violet" name="areas" colorGroupingField="population" colorGroups={colorGroups} customize={customizeLayer} ></Layer> <Tooltip enabled={true} customizeTooltip={customizeTooltip}></Tooltip> <Legend customizeText={customizeText}> <Source layer="areas" grouping="color"></Source> </Legend> </VectorMap> ); }
import React from 'react'; import VectorMap, { Layer, Legend, Source, Tooltip, } from 'devextreme-react/vector-map'; import * as mapsData from 'devextreme-dist/js/vectormap-data/world.js'; import { populations } from './data.js'; const colorGroups = [0, 0.5, 0.8, 1, 2, 3, 100]; const bounds = [-180, 85, 180, -60]; const customizeLayer = (elements) => { elements.forEach((element) => { element.attribute('population', populations[element.attribute('name')]); }); }; const customizeText = (arg) => { let text; if (arg.index === 0) { text = '< 0.5%'; } else if (arg.index === 5) { text = '> 3%'; } else { text = `${arg.start}% to ${arg.end}%`; } return text; }; const customizeTooltip = (arg) => { if (arg.attribute('population')) { return { text: `${arg.attribute('name')}: ${arg.attribute('population')}% of world population`, }; } return null; }; export default function App() { return ( <VectorMap id="vector-map" bounds={bounds} > <Layer dataSource={mapsData.world} palette="Violet" name="areas" colorGroupingField="population" colorGroups={colorGroups} customize={customizeLayer} ></Layer> <Tooltip enabled={true} customizeTooltip={customizeTooltip} ></Tooltip> <Legend customizeText={customizeText}> <Source layer="areas" grouping="color" ></Source> </Legend> </VectorMap> ); }
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
export const populations = { China: 19, India: 17.4, 'United States': 4.44, Indonesia: 3.45, Brazil: 2.83, Pakistan: 2.62, Nigeria: 2.42, Bangladesh: 2.18, Russia: 2.04, Japan: 1.77, Mexico: 1.67, Philippines: 1.39, Vietnam: 1.25, Ethiopia: 1.23, Egypt: 1.21, Germany: 1.13, Iran: 1.08, Turkey: 1.07, 'Congo (Kinshasa)': 0.94, France: 0.92, Thailand: 0.9, 'United Kingdom': 0.89, Italy: 0.85, Burma: 0.84, 'South Africa': 0.74, 'S. Korea': 0.7, Colombia: 0.66, Spain: 0.65, Tanzania: 0.63, Kenya: 0.62, Ukraine: 0.6, Argentina: 0.59, Algeria: 0.54, Poland: 0.54, Sudan: 0.52, Canada: 0.49, Uganda: 0.49, Iraq: 0.47, Morocco: 0.46, Uzbekistan: 0.43, };
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, }, 'devextreme-dist/js/vectormap-data/*': { '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', 'devextreme-dist/js/vectormap-data': 'npm:devextreme-dist@link:../../packages/devextreme/artifacts/npm/devextreme-dist/js/vectormap-data', '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);
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
export const populations = { China: 19, India: 17.4, 'United States': 4.44, Indonesia: 3.45, Brazil: 2.83, Pakistan: 2.62, Nigeria: 2.42, Bangladesh: 2.18, Russia: 2.04, Japan: 1.77, Mexico: 1.67, Philippines: 1.39, Vietnam: 1.25, Ethiopia: 1.23, Egypt: 1.21, Germany: 1.13, Iran: 1.08, Turkey: 1.07, 'Congo (Kinshasa)': 0.94, France: 0.92, Thailand: 0.9, 'United Kingdom': 0.89, Italy: 0.85, Burma: 0.84, 'South Africa': 0.74, 'S. Korea': 0.7, Colombia: 0.66, Spain: 0.65, Tanzania: 0.63, Kenya: 0.62, Ukraine: 0.6, Argentina: 0.59, Algeria: 0.54, Poland: 0.54, Sudan: 0.52, Canada: 0.49, Uganda: 0.49, Iraq: 0.47, Morocco: 0.46, Uzbekistan: 0.43, };
<!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/24.2.3/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/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>
#vector-map { height: 440px; }