DevExtreme v24.1 is now available.

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

Your search did not match any results.

React Charts - Colorization

This demo shows options that you can use to colorize TreeMap tiles. To see each option, use the drop-down editor below the component.

Backend API
import React, { useCallback, useState } from 'react'; import TreeMap, { Tooltip, ITooltipProps } from 'devextreme-react/tree-map'; import SelectBox, { SelectBoxTypes } from 'devextreme-react/select-box'; import { salesAmount, colorizationOptions, colorizationTypeLabel } from './data.ts'; const customizeTooltip: ITooltipProps['customizeTooltip'] = (arg) => { const { data } = arg.node; return { text: arg.node.isLeaf() ? `<span class='product'>${data.name}</span><br/>Sales Amount: ${arg.valueText}` : null, }; }; function App() { const [typeOptions, setTypeOptions] = useState(colorizationOptions[2].options); const setType = useCallback((data: SelectBoxTypes.ValueChangedEvent) => { setTypeOptions(data.value); }, [setTypeOptions]); return ( <React.Fragment> <TreeMap id="treemap" dataSource={salesAmount} title="Sales Amount by Product" valueField="salesAmount" colorizer={typeOptions} > <Tooltip enabled={true} customizeTooltip={customizeTooltip} format="currency" /> </TreeMap> <div className="options"> <div className="caption">Options</div> <div className="option"> <span>Colorization Type </span> <SelectBox dataSource={colorizationOptions} displayExpr="name" inputAttr={colorizationTypeLabel} valueExpr="options" width={200} value={typeOptions} onValueChanged={setType} /> </div> </div> </React.Fragment> ); } export default App;
import React, { useCallback, useState } from 'react'; import TreeMap, { Tooltip } from 'devextreme-react/tree-map'; import SelectBox from 'devextreme-react/select-box'; import { salesAmount, colorizationOptions, colorizationTypeLabel } from './data.js'; const customizeTooltip = (arg) => { const { data } = arg.node; return { text: arg.node.isLeaf() ? `<span class='product'>${data.name}</span><br/>Sales Amount: ${arg.valueText}` : null, }; }; function App() { const [typeOptions, setTypeOptions] = useState(colorizationOptions[2].options); const setType = useCallback( (data) => { setTypeOptions(data.value); }, [setTypeOptions], ); return ( <React.Fragment> <TreeMap id="treemap" dataSource={salesAmount} title="Sales Amount by Product" valueField="salesAmount" colorizer={typeOptions} > <Tooltip enabled={true} customizeTooltip={customizeTooltip} format="currency" /> </TreeMap> <div className="options"> <div className="caption">Options</div> <div className="option"> <span>Colorization Type </span> <SelectBox dataSource={colorizationOptions} displayExpr="name" inputAttr={colorizationTypeLabel} valueExpr="options" width={200} value={typeOptions} onValueChanged={setType} /> </div> </div> </React.Fragment> ); } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
import { Properties as TreeMapPropType } from 'devextreme/viz/tree_map'; type typeOptionsType = TreeMapPropType['colorizer']; export const colorizationOptions: { name: string, options: typeOptionsType }[] = [{ name: 'Discrete', options: { type: 'discrete', palette: 'Harmony Light', colorizeGroups: false, }, }, { name: 'Grouped', options: { type: 'discrete', palette: 'Harmony Light', colorizeGroups: true, }, }, { name: 'Range', options: { type: 'range', palette: ['#fbd600', '#78299a'], range: [0, 50000, 100000, 150000, 200000, 250000], colorCodeField: 'salesAmount', colorizeGroups: false, }, }, { name: 'Gradient', options: { type: 'gradient', palette: ['#fbd600', '#78299a'], range: [10000, 250000], colorCodeField: 'salesAmount', colorizeGroups: false, }, }]; export const salesAmount = [{ name: 'Monitors', items: [{ name: 'DesktopLCD 19', salesAmount: 23420, }, { name: 'DesktopLCD 21', salesAmount: 113900, }, { name: 'DesktopLED 19', salesAmount: 49170, }, { name: 'DesktopLED 21', salesAmount: 81200, }], }, { name: 'Projectors', items: [{ name: 'Projector Plus', salesAmount: 99000, }, { name: 'Projector PlusHD', salesAmount: 152250, }], }, { name: 'Televisions', items: [{ name: 'SuperLCD 55', salesAmount: 147150, }, { name: 'SuperLCD 42', salesAmount: 103200, }, { name: 'SuperLCD 70', salesAmount: 56000, }, { name: 'SuperLED 42', salesAmount: 159500, }, { name: 'SuperLED 50', salesAmount: 233600, }, { name: 'SuperPlasma 50', salesAmount: 184800, }, { name: 'SuperPlasma 65', salesAmount: 178500, }], }, { name: 'Video Players', items: [{ name: 'HD Video Player', salesAmount: 63690, }, { name: 'SuperHD Video Player', salesAmount: 74000, }], }]; export const colorizationTypeLabel = { 'aria-label': 'Colorization Type' };
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, }, }, paths: { 'npm:': 'https://unpkg.com/', }, defaultExtension: 'js', map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.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@15.8.1/prop-types.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@24.1.6/cjs', 'devextreme-react': 'npm:devextreme-react@24.1.6/cjs', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.11/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.56/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13', '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@7.4.11/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.13/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 colorizationOptions = [ { name: 'Discrete', options: { type: 'discrete', palette: 'Harmony Light', colorizeGroups: false, }, }, { name: 'Grouped', options: { type: 'discrete', palette: 'Harmony Light', colorizeGroups: true, }, }, { name: 'Range', options: { type: 'range', palette: ['#fbd600', '#78299a'], range: [0, 50000, 100000, 150000, 200000, 250000], colorCodeField: 'salesAmount', colorizeGroups: false, }, }, { name: 'Gradient', options: { type: 'gradient', palette: ['#fbd600', '#78299a'], range: [10000, 250000], colorCodeField: 'salesAmount', colorizeGroups: false, }, }, ]; export const salesAmount = [ { name: 'Monitors', items: [ { name: 'DesktopLCD 19', salesAmount: 23420, }, { name: 'DesktopLCD 21', salesAmount: 113900, }, { name: 'DesktopLED 19', salesAmount: 49170, }, { name: 'DesktopLED 21', salesAmount: 81200, }, ], }, { name: 'Projectors', items: [ { name: 'Projector Plus', salesAmount: 99000, }, { name: 'Projector PlusHD', salesAmount: 152250, }, ], }, { name: 'Televisions', items: [ { name: 'SuperLCD 55', salesAmount: 147150, }, { name: 'SuperLCD 42', salesAmount: 103200, }, { name: 'SuperLCD 70', salesAmount: 56000, }, { name: 'SuperLED 42', salesAmount: 159500, }, { name: 'SuperLED 50', salesAmount: 233600, }, { name: 'SuperPlasma 50', salesAmount: 184800, }, { name: 'SuperPlasma 65', salesAmount: 178500, }, ], }, { name: 'Video Players', items: [ { name: 'HD Video Player', salesAmount: 63690, }, { name: 'SuperHD Video Player', salesAmount: 74000, }, ], }, ]; export const colorizationTypeLabel = { 'aria-label': 'Colorization Type' };
<!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="dx-theme" data-theme="generic.light" href="https://cdn3.devexpress.com/jslib/24.1.6/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>
.product { font-weight: 500; } .options { padding: 20px; background-color: rgba(191, 191, 191, 0.15); margin-top: 20px; } .option { margin-top: 10px; } .caption { font-size: 18px; font-weight: 500; } .option > span { margin-right: 10px; } .option > .dx-widget { display: inline-block; vertical-align: middle; }

To colorize the TreeMap tiles, you can use the colorizer object. This object allows you to specify the colorization type:

  • "discrete" (default)
    This colorization algorithm paints each tile within a group in a color from the palette. When there are multiple groups, the way in which groups are colorized depends on the colorizeGroups property setting:

    • If colorizeGroups is set to false (Discrete mode in the demo):
      Each group is painted independently - regardless of the colors used in other groups.

    • If colorizeGroups is set to true (Grouped mode in the demo):
      Each group is painted with a different color from the palette.

  • "gradient"
    If you choose this algorithm, the palette should contain only two colors that the component uses to colorize the smallest and the largest tile, respectively. The other tiles will have a tint of either the first or the second color depending on their size. In order to use the "gradient" algorithm, you need to set the range property to an array of only two values.

  • "range"
    This algorithm is similar to "gradient", but the array assigned to the range property should contain more than two values. This array specifies the ranges between each value. The palette of two colors will generate multiple tints - one for each range.

If you use the "gradient" or "range" colorization algorithm, the color of the tile depends on the value. Normally, the value field supplies this value to the component. However, you can use the colorCodeField property to assign another field to supply the value.