DevExtreme v24.1 is now available.

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

Your search did not match any results.

Angular 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
<dx-tree-map [dataSource]="salesAmount" title="Sales Amount by Product" valueField="salesAmount" [colorizer]="options" > <dxo-tooltip [enabled]="true" format="currency" [customizeTooltip]="customizeTooltip" ></dxo-tooltip> </dx-tree-map> <div class="options"> <div class="caption">Options</div> <div class="option"> <span>Colorization Type</span> <dx-select-box #selectbox class="selectbox" [items]="colorizationOptions" [inputAttr]="{ 'aria-label': 'Colorization Option' }" [width]="200" [(value)]="options" displayExpr="name" valueExpr="options" > </dx-select-box> </div> </div>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxSelectBoxModule } from 'devextreme-angular'; import { DxTreeMapModule, DxTreeMapTypes } from 'devextreme-angular/ui/tree-map'; import { SalesAmount, Service } from './app.service'; interface ColorizationOption { name: string; options: { type: DxTreeMapTypes.TreeMapColorizerType, palette: string | string[], colorizeGroups: boolean, colorCodeField?: string, range?: number[], }; } if (!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: `app/app.component.html`, styleUrls: [`app/app.component.css`], providers: [Service], preserveWhitespaces: true, }) export class AppComponent { salesAmount: SalesAmount[]; options: ColorizationOption[ 'options' ]; colorizationOptions: ColorizationOption[] = [{ 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, }, }]; constructor(service: Service) { this.salesAmount = service.getSalesAmount(); this.options = this.colorizationOptions[2].options; } customizeTooltip = ({ node, valueText }) => ( { text: node.isLeaf() ? (`<span class='product'>${node.data.name}</span><br/>Sales Amount: ${valueText}`) : null, } ); } @NgModule({ imports: [ BrowserModule, DxTreeMapModule, DxSelectBoxModule, ], declarations: [AppComponent], bootstrap: [AppComponent], }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep .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; } ::ng-deep .option > .dx-widget { display: inline-block; vertical-align: middle; }
import { Injectable } from '@angular/core'; export interface SalesAmount { name: string; items: Record<string, unknown>[]; } const salesAmount: 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, }], }]; @Injectable() export class Service { getSalesAmount() { return salesAmount; } }
// In real applications, you should not transpile code in the browser. // You can see how to create your own application with Angular and DevExtreme here: // https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/ const componentNames = [ 'accordion', 'action-sheet', 'autocomplete', 'bar-gauge', 'box', 'bullet', 'button-group', 'button', 'calendar', 'chart', 'check-box', 'circular-gauge', 'color-box', 'context-menu', 'data-grid', 'date-box', 'date-range-box', 'defer-rendering', 'diagram', 'draggable', 'drawer', 'drop-down-box', 'drop-down-button', 'file-manager', 'file-uploader', 'filter-builder', 'form', 'funnel', 'gallery', 'gantt', 'html-editor', 'linear-gauge', 'list', 'load-indicator', 'load-panel', 'lookup', 'map', 'menu', 'multi-view', 'nested', 'number-box', 'pie-chart', 'pivot-grid-field-chooser', 'pivot-grid', 'polar-chart', 'popover', 'popup', 'progress-bar', 'radio-group', 'range-selector', 'range-slider', 'recurrence-editor', 'resizable', 'responsive-box', 'sankey', 'scheduler', 'scroll-view', 'select-box', 'slider', 'sortable', 'sparkline', 'speed-dial-action', 'splitter', 'switch', 'tab-panel', 'tabs', 'tag-box', 'text-area', 'text-box', 'tile-view', 'toast', 'toolbar', 'tooltip', 'tree-list', 'tree-map', 'tree-view', 'validation-group', 'validation-summary', 'validator', 'vector-map', ]; window.exports = window.exports || {}; window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, }, meta: { 'typescript': { 'exports': 'ts', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, '@angular/platform-browser-dynamic': { 'esModule': true, }, '@angular/platform-browser': { 'esModule': true, }, '@angular/core': { 'esModule': true, }, '@angular/common': { 'esModule': true, }, '@angular/common/http': { 'esModule': true, }, '@angular/compiler': { 'esModule': true, }, '@angular/animations': { 'esModule': true, }, '@angular/forms': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', 'bundles:': '../../../../bundles/', }, map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', /* @angular */ '@angular/compiler': 'bundles:@angular/compiler.umd.js', '@angular/platform-browser-dynamic': 'bundles:@angular/platform-browser-dynamic.umd.js', '@angular/core': 'bundles:@angular/core.umd.js', '@angular/core/primitives/signals': 'bundles:@angular/core.primitives.signals.umd.js', '@angular/common': 'bundles:@angular/common.umd.js', '@angular/common/http': 'bundles:@angular/common-http.umd.js', '@angular/platform-browser': 'bundles:@angular/platform-browser.umd.js', '@angular/platform-browser/animations': 'bundles:@angular/platform-browser.umd.js', '@angular/forms': 'bundles:@angular/forms.umd.js', /* devextreme */ 'devextreme': 'npm:devextreme@24.1.6/cjs', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13', 'devextreme/bundles/dx.all': 'npm:devextreme@24.1.6/bundles/dx.all.js', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.11', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.56', /* devextreme-angular umd maps */ 'devextreme-angular': 'bundles:devextreme-angular/devextreme-angular.umd.js', 'devextreme-angular/core': 'bundles:devextreme-angular/devextreme-angular-core.umd.js', 'devextreme-angular/http': 'bundles:devextreme-angular/devextreme-angular-http.umd.js', ...componentNames.reduce((acc, name) => { acc[`devextreme-angular/ui/${name}`] = `bundles:devextreme-angular/devextreme-angular-ui-${name}.umd.js`; return acc; }, {}), 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'tslib': 'npm:tslib@2.6.1/tslib.js', 'rxjs': 'npm:rxjs@7.5.3/dist/bundles/rxjs.umd.js', 'rxjs/operators': 'npm:rxjs@7.5.3/dist/cjs/operators/index.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', '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', // Prettier 'prettier/standalone': 'npm:prettier@2.8.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js', }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, 'rxjs': { defaultExtension: 'js', }, 'rxjs/operators': { defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.13/inferno/package.json', 'npm:rxjs@7.5.3/package.json', 'npm:rxjs@7.5.3/operators/package.json', 'npm:devexpress-diagram@2.2.11/package.json', 'npm:devexpress-gantt@4.1.56/package.json', ], }; System.config(window.config); // System.import('@angular/compiler').catch(console.error.bind(console));
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" 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.1.6/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.13.3/bundles/zone.umd.min.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.13/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import("app").catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>

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.