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
import React from 'react'; import TreeMap, { Colorizer, Tooltip } from 'devextreme-react/tree-map'; import SelectBox from 'devextreme-react/select-box'; import { populationByAge } from './data.js'; const algorithms = ['sliceAndDice', 'squarified', 'strip', 'custom']; class App extends React.Component { constructor(props) { super(props); this.state = { selectedAlgorithm: algorithms[2], currentAlgorithm: getCurrentAlgorithm(algorithms[2]) }; this.setAlgorithm = this.setAlgorithm.bind(this); } render() { return ( <React.Fragment> <TreeMap id="treemap" dataSource={populationByAge} layoutAlgorithm={this.state.currentAlgorithm} title="Population by Age Groups" > <Colorizer colorizeGroups={true} type="discrete" /> <Tooltip enabled={true} customizeTooltip={customizeTooltip} format="thousands" /> </TreeMap> <div className="options"> <div className="caption">Options</div> <div className="option"> <span>Tiling Algorithm </span> <SelectBox dataSource={algorithms} width={200} value={this.state.selectedAlgorithm} onValueChanged={this.setAlgorithm} /> </div> </div> </React.Fragment> ); } setAlgorithm(data) { this.setState({ selectedAlgorithm: data.value, currentAlgorithm: getCurrentAlgorithm(data.value) }); } } function 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; }); } function getCurrentAlgorithm(selectedAlgorithm) { let currentAlgorithm = selectedAlgorithm.toLowerCase(); if(currentAlgorithm === 'custom') { currentAlgorithm = customAlgorithm; } return currentAlgorithm; } function 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>` }; } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render( <App />, document.getElementById('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" /> <link rel="stylesheet" type ="text/css" href="styles.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>
#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; }
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/' }, defaultExtension: 'js', map: { 'react': 'npm:react@16/umd/react.development.js', 'react-dom': 'npm:react-dom@16/umd/react-dom.development.js', 'prop-types': 'npm:prop-types/prop-types.js', 'devextreme': 'npm:devextreme@19.2', 'devextreme-react': 'npm:devextreme-react@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', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, packages: { 'devextreme': { defaultExtension: 'js' }, 'devextreme-react': { main: 'index.js' } }, babelOptions: { sourceMaps: false, stage0: true, react: true } });