Your search did not match any results.
Tree Map

Tiling Algorithms

Documentation

The TreeMap component supports three layout algorithms out of the box and provides the capability to implement your own algorithm. In this demo, you can change the applied algorithm at runtime using the drop-down menu above the component.

www.wikipedia.org
Backend API
Copy to CodeSandBox
Apply
Reset
<dx-tree-map id="treemap" [dataSource]="getPopulationsByAge" title="Population by Age Groups" [layoutAlgorithm]=" selectbox.value === 'custom' ? customAlgorithm : selectbox.value " > <dxo-colorizer type="discrete" [colorizeGroups]="true"></dxo-colorizer> <dxo-tooltip [enabled]="true" format="thousands" [customizeTooltip]="customizeTooltip" ></dxo-tooltip> </dx-tree-map> <div class="options"> <div class="caption">Options</div> <div class="option"> <span>Tiling Algorithm</span> <dx-select-box #selectbox [items]="algorithms" [width]="200" [value]="algorithms[2]" > </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 { DxTreeMapModule, DxSelectBoxModule } from 'devextreme-angular'; import { PopulationByAge, Service } from './app.service'; 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 { getPopulationsByAge: PopulationByAge[]; algorithms = ['sliceAndDice', 'squarified', 'strip', 'custom']; constructor(service: Service) { this.getPopulationsByAge = service.getPopulationsByAge(); } customizeTooltip(arg) { const data = arg.node.data; const parentData = arg.node.getParent().data; let result = ''; if (arg.node.isLeaf()) { result = `<span class='country'>${parentData.name}</span><br />${ data.name}<br />${arg.valueText} (${ (100 * data.value / parentData.total).toFixed(1)}%)`; } else { result = `<span class='country'>${data.name}</span>`; } return { text: result, }; } customAlgorithm(arg) { let side = 0; const totalRect = arg.rect.slice(); let totalSum = arg.sum; arg.items.forEach((item) => { const size = Math.round((totalRect[side + 2] - totalRect[side]) * item.value / totalSum); let pos; const rect = totalRect.slice(); totalSum -= item.value; rect[side + 2] = totalRect[side] = totalRect[side] + size; item.rect = rect; side = 1 - side; }); } } @NgModule({ imports: [ BrowserModule, DxTreeMapModule, DxSelectBoxModule, ], declarations: [AppComponent], bootstrap: [AppComponent], }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep #treemap { height: 460px; } ::ng-deep .country { font-weight: 500; } ::ng-deep .options { padding: 20px; background-color: rgba(191, 191, 191, 0.15); margin-top: 20px; } ::ng-deep .option { margin-top: 10px; } ::ng-deep .caption { font-size: 18px; font-weight: 500; } ::ng-deep .option > span { margin-right: 10px; } ::ng-deep .option > .dx-widget { display: inline-block; vertical-align: middle; }
import { Injectable } from '@angular/core'; export interface PopulationByAge { name: string; total: number; items: any[]; } const populationsByAge: PopulationByAge[] = [{ name: 'Brazil', total: 200050486, items: [{ name: 'Age 0-14', value: 48058462, }, { name: 'Age 15-44', value: 96036995, }, { name: 'Age 45-64', value: 40715296, }, { name: 'Age 65+', value: 15239733, }], }, { name: 'Japan', total: 126345237, items: [{ name: 'Age 0-14', value: 16593766, }, { name: 'Age 15-44', value: 45455276, }, { name: 'Age 45-64', value: 32845790, }, { name: 'Age 65+', value: 31450405, }], }, { name: 'United States', total: 318497627, items: [{ name: 'Age 0-14', value: 63968935, }, { name: 'Age 15-44', value: 127217843, }, { name: 'Age 45-64', value: 83145484, }, { name: 'Age 65+', value: 44165365, }], }]; @Injectable() export class Service { getPopulationsByAge() { return populationsByAge; } }
// 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/ window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, }, meta: { 'typescript': { 'exports': 'ts', }, 'devextreme/localization.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@3.5.3/lib/typescript.js', '@angular/core': 'npm:@angular/core@12.2.13', '@angular/platform-browser': 'npm:@angular/platform-browser@12.2.13', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@12.2.13', '@angular/forms': 'npm:@angular/forms@12.2.13', '@angular/common/http': 'npm:@angular/common@12.2.13/bundles/common-http.umd.js', '@angular/common': 'npm:@angular/common@12.2.13', '@angular/compiler': 'npm:@angular/compiler@12.2.13', 'tslib': 'npm:tslib@2.3.1/tslib.js', 'rxjs': 'npm:rxjs@6.4.0', 'rrule': 'npm:rrule@2.6.6/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@21.2.3/cjs', 'devextreme/bundles/dx.all': 'npm:devextreme@21.2.3/bundles/dx.all.js', 'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.5.5/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.1.37', 'devexpress-gantt': 'npm:devexpress-gantt@3.1.24', 'devextreme-angular': 'npm:devextreme-angular@21.2.3', '@devextreme/vdom': 'npm:@devextreme/vdom@2.2.3', '@devextreme/runtime': 'npm:@devextreme/runtime@2.3.8', 'inferno': 'npm:inferno@7.4.10/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat@7.4.10/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.10/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom@1.0.7/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.10/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode@7.4.10/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class@7.4.10/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras@7.4.10/dist/inferno-extras.min.js', }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts', }, 'devextreme': { defaultExtension: 'js', }, '@devextreme/vdom': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@2.3.8/inferno/package.json', 'npm:@angular/*/package.json', 'npm:@angular/common/*/package.json', 'npm:rxjs@6.4.0/package.json', 'npm:rxjs@6.4.0/operators/package.json', 'npm:devextreme-angular/*/package.json', 'npm:devextreme-angular@21.2.3/ui/*/package.json', 'npm:devextreme-angular@21.2.3/package.json', 'npm:devexpress-diagram@2.1.37/package.json', 'npm:devexpress-gantt@3.1.24/package.json', ], }; System.config(window.config);
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <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=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/21.2.3/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/21.2.3/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.11.4/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.3/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>