Your search did not match any results.
Tree Map

Tiling Algorithms

Documentation

The TreeMap widget 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 widget.

www.geohive.com
Copy to CodeSandBox
Apply
Reset
<template> <div> <dx-tree-map id="treemap" :data-source="populationByAge" :layout-algorithm="currentAlgorithm" title="Population by Age Groups" > <dx-colorizer :colorize-groups="true" type="discrete" /> <dx-tooltip :enabled="true" :customize-tooltip="customizeTooltip" format="thousands" /> </dx-tree-map> <div class="options"> <div class="caption">Options</div> <div class="option"> <span>Tiling Algorithm</span> <dx-select-box :data-source="algorithms" :width="200" v-model="selectedAlgorithm" /> </div> </div> </div> </template> <script> import DxTreeMap, { DxColorizer, DxTooltip } from 'devextreme-vue/tree-map'; import { DxSelectBox } from 'devextreme-vue/select-box'; import { populationByAge } from './data.js'; export default { components: { DxTreeMap, DxColorizer, DxTooltip, DxSelectBox }, data() { const algorithms = ['sliceAndDice', 'squarified', 'strip', 'custom']; return { populationByAge, algorithms, selectedAlgorithm: algorithms[2] }; }, computed: { currentAlgorithm() { let currentAlgorithm = this.selectedAlgorithm; if(currentAlgorithm === 'custom') { currentAlgorithm = this.customAlgorithm; } return currentAlgorithm; } }, methods: { customizeTooltip(arg) { const data = arg.node.data; const parentData = arg.node.getParent().data; return { text: arg.node.isLeaf() ? `<span class='country'>${parentData.name}</span><br />${data.name}<br />${arg.valueText}(${(100 * data.value / parentData.total).toFixed(1)}%)` : `<span class='country'>${data.name}</span>` }; }, customAlgorithm(arg) { const totalRect = arg.rect.slice(); let totalSum = arg.sum; let side = 0; arg.items.forEach(item => { const size = Math.round((totalRect[side + 2] - totalRect[side]) * item.value / totalSum); const rect = totalRect.slice(); totalSum -= item.value; rect[side + 2] = totalRect[side] = totalRect[side] + size; item.rect = rect; side = 1 - side; }); } } }; </script> <style scoped> #treemap { height: 460px; } .country { 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; } </style>
import Vue from 'vue'; import App from './App.vue'; new Vue({ el: '#app', components: { App }, template: '<App/>' });
<!DOCTYPE html> <html> <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/19.2.4/css/dx.common.css" /> <link rel="dx-theme" data-theme="generic.light" href="https://cdn3.devexpress.com/jslib/19.2.4/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/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.js'); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> </div> </div> </body> </html>
export const 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 }] }];
System.config({ transpiler: 'plugin-babel', paths: { 'npm:': 'https://unpkg.com/' }, map: { vue: 'npm:vue@2.6.3/dist/vue.esm.browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@latest/index.js', 'devextreme': 'npm:devextreme@19.2', 'devextreme-vue': 'npm:devextreme-vue@19.2', jszip: 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'devexpress-gantt': 'npm:devexpress-gantt', 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, meta: { '*.vue': { loader: 'vue-loader' } }, packages: { 'devextreme-vue': { main: 'index.js' }, 'devextreme': { defaultExtension: 'js' } }, babelOptions: { sourceMaps: false, stage0: true } });