Column with Drill-down

The FlexChart control supports the implementation of drill-down charts. This column chart uses FlexChart's selectionChanged event to determine which column the user has clicked on, and then updates the chart's itemsSource with new data, as well as changing the chart's color to show that new data is being displayed.

Learn about FlexChart | Drill-Down Documentation | FlexChart API Reference

import 'bootstrap.css'; import '@mescius/wijmo.styles/wijmo.css'; import './styles.css'; // import * as core from '@mescius/wijmo'; import * as chart from '@mescius/wijmo.chart'; import * as animation from '@mescius/wijmo.chart.animation'; import { getData, getGroupData } from './data'; // document.readyState === 'complete' ? init() : window.onload = init; var barchart; var view; // function init() { view = getData(); barchart = new chart.FlexChart('#chart', { legend: { position: chart.Position.None }, bindingX: 'name', series: [{ binding: 'gdp', name: 'GDP' }], axisX: { title: 'Year', format: 'd' }, axisY: { title: 'GDP (US$ in billions)' }, tooltip: { content: '' }, selectionMode: chart.SelectionMode.Point, selectionChanged: (s) => { if (s.selection) { let point = s.selection.collectionView.currentItem; if (point && point.group && !point.group.isBottomLevel) { showGroup(point.group); } } }, itemsSource: getGroupData(view), palette: ['rgba(45,159,199,1)', 'rgba(236,153,60,1)', 'rgba(137,194,53,1)', 'rgba(227,119,164,1)', 'rgba(166,137,49,1)', 'rgba(166,114,166,1)', 'rgba(208,192,65,1)', 'rgba(227,88,85,1)', 'rgba(104,112,106,1)'] }); // let ani = new animation.ChartAnimation(barchart); } // function showGroup(group) { // update titles updateChartHeader(group); let level = 'level' in group ? group.level + 1 : 0; barchart.axisX.title = core.toHeaderCase(view.groupDescriptions[level].propertyName); // // update the series color (use a different one for each level) let palette = barchart.palette || chart.Palettes.standard; barchart.series[0].style = { fill: palette[level], stroke: palette[level] }; // // update data barchart.itemsSource = getGroupData(group); barchart.selection = null; } // // update the chart header element var header = document.getElementById('header'); function updateChartHeader(group) { let item = group.items[0], path = '', headers = []; // for (let i = 0; i <= group.level; i++) { let prop = view.groupDescriptions[i].propertyName, hdr = core.format('<a href="#{path}">{prop}</a>: {value}', { path: path, prop: core.toHeaderCase(prop), value: item[prop] }); // headers.push(hdr); path += '/' + item[prop]; } // header.innerHTML = headers.length > 0 ? 'IMF estimates GDP(nominal) GDP for ' + headers.join(', ') : 'IMF estimates GDP(nominal) GDP'; } // // handle clicks on chart's header element to navigate back up header.addEventListener('click', function (e) { if (e.target.nodeName === 'A') { e.preventDefault(); // // get the link path let path = e.target.href; path = path.substr(path.lastIndexOf('#') + 1); let paths = path.split('/'); // // find the group that matches the path let src = view; for (let i = 1; i < paths.length; i++) { for (let j = 0; j < src.groups.length; j++) { let group = src.groups[j]; if (group.name == paths[i]) { src = group; break; } } } // show the selected group showGroup(src); } });
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo FlexChart Column with Drill-down</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.21.5/system.src.js" integrity="sha512-skZbMyvYdNoZfLmiGn5ii6KmklM82rYX2uWctBhzaXPxJgiv4XBwJnFGr5k8s+6tE1pcR1nuTKghozJHyzMcoA==" crossorigin="anonymous"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div class="container-fluid"> <h4 id="header">IMF estimates GDP(nominal) GDP</h4> <div id="chart"></div> </div> </body> </html>
// IMF estimates GDP(nominal) between 2020 and 2023 // https://en.wikipedia.org/wiki/List_of_countries_by_past_and_projected_GDP_(nominal) import * as core from '@mescius/wijmo'; export function getData() { let data = [ { country: 'United States', continent: 'North America', year: 2020, gdp: 22289 }, { country: 'United States', continent: 'North America', year: 2021, gdp: 23096 }, { country: 'United States', continent: 'North America', year: 2022, gdp: 23874 }, { country: 'United States', continent: 'North America', year: 2023, gdp: 24670 }, { country: 'China', continent: 'Asia', year: 2020, gdp: 15461 }, { country: 'China', continent: 'Asia', year: 2021, gdp: 16768 }, { country: 'China', continent: 'Asia', year: 2022, gdp: 18131 }, { country: 'China', continent: 'Asia', year: 2023, gdp: 19580 }, { country: 'Japan', continent: 'Asia', year: 2020, gdp: 5371 }, { country: 'Japan', continent: 'Asia', year: 2021, gdp: 5522 }, { country: 'Japan', continent: 'Asia', year: 2022, gdp: 5714 }, { country: 'Japan', continent: 'Asia', year: 2023, gdp: 5907 }, { country: 'Gemany', continent: 'Europe', year: 2020, gdp: 4331 }, { country: 'Gemany', continent: 'Europe', year: 2021, gdp: 4523 }, { country: 'Gemany', continent: 'Europe', year: 2022, gdp: 4736 }, { country: 'Gemany', continent: 'Europe', year: 2023, gdp: 4937 }, { country: 'India', continent: 'Asia', year: 2020, gdp: 3258 }, { country: 'India', continent: 'Asia', year: 2021, gdp: 3586 }, { country: 'India', continent: 'Asia', year: 2022, gdp: 3941 }, { country: 'India', continent: 'Asia', year: 2023, gdp: 4329 }, { country: 'France', continent: 'Europe', year: 2020, gdp: 2979 }, { country: 'France', continent: 'Europe', year: 2021, gdp: 3100 }, { country: 'France', continent: 'Europe', year: 2022, gdp: 3234 }, { country: 'France', continent: 'Europe', year: 2023, gdp: 3363 }, { country: 'United Kindom', continent: 'Europe', year: 2020, gdp: 2912 }, { country: 'United Kindom', continent: 'Europe', year: 2021, gdp: 3012 }, { country: 'United Kindom', continent: 'Europe', year: 2022, gdp: 3135 }, { country: 'United Kindom', continent: 'Europe', year: 2023, gdp: 3257 }, { country: 'Italy', continent: 'Europe', year: 2020, gdp: 2191 }, { country: 'Italy', continent: 'Europe', year: 2021, gdp: 2255 }, { country: 'Italy', continent: 'Europe', year: 2022, gdp: 2329 }, { country: 'Italy', continent: 'Europe', year: 2023, gdp: 2395 }, { country: 'Brazil', continent: 'South America', year: 2020, gdp: 2027 }, { country: 'Brazil', continent: 'South America', year: 2021, gdp: 2129 }, { country: 'Brazil', continent: 'South America', year: 2022, gdp: 2237 }, { country: 'Brazil', continent: 'South America', year: 2023, gdp: 2351 }, { country: 'Canada', continent: 'North America', year: 2020, gdp: 1937 }, { country: 'Canada', continent: 'North America', year: 2021, gdp: 2053 }, { country: 'Canada', continent: 'North America', year: 2022, gdp: 2185 }, { country: 'Canada', continent: 'North America', year: 2023, gdp: 2321 }, { country: 'South Korea', continent: 'Asia', year: 2020, gdp: 1781 }, { country: 'South Korea', continent: 'Asia', year: 2021, gdp: 1864 }, { country: 'South Korea', continent: 'Asia', year: 2022, gdp: 1959 }, { country: 'South Korea', continent: 'Asia', year: 2023, gdp: 2054 }, { country: 'Russia', continent: 'Europe', year: 2020, gdp: 1683 }, { country: 'Russia', continent: 'Europe', year: 2021, gdp: 1719 }, { country: 'Russia', continent: 'Europe', year: 2022, gdp: 1757 }, { country: 'Russia', continent: 'Europe', year: 2023, gdp: 1818 }, { country: 'Spain', continent: 'Europe', year: 2020, gdp: 1550 }, { country: 'Spain', continent: 'Europe', year: 2021, gdp: 1616 }, { country: 'Spain', continent: 'Europe', year: 2022, gdp: 1690 }, { country: 'Spain', continent: 'Europe', year: 2023, gdp: 1758 }, { country: 'Australia', continent: 'Oceania', year: 2020, gdp: 1541 }, { country: 'Australia', continent: 'Oceania', year: 2021, gdp: 1615 }, { country: 'Australia', continent: 'Oceania', year: 2022, gdp: 1700 }, { country: 'Australia', continent: 'Oceania', year: 2023, gdp: 1794 }, { country: 'Mexico', continent: 'North America', year: 2020, gdp: 1306 }, { country: 'Mexico', continent: 'North America', year: 2021, gdp: 1376 }, { country: 'Mexico', continent: 'North America', year: 2022, gdp: 1449 }, { country: 'Mexico', continent: 'North America', year: 2023, gdp: 1526 }, { country: 'Indonesia', continent: 'Asia', year: 2020, gdp: 1175 }, { country: 'Indonesia', continent: 'Asia', year: 2021, gdp: 1259 }, { country: 'Indonesia', continent: 'Asia', year: 2022, gdp: 1349 }, { country: 'Indonesia', continent: 'Asia', year: 2023, gdp: 1446 }, { country: 'Netherlands', continent: 'Europe', year: 2020, gdp: 980 }, { country: 'Netherlands', continent: 'Europe', year: 2021, gdp: 1021 }, { country: 'Netherlands', continent: 'Europe', year: 2022, gdp: 1065 }, { country: 'Netherlands', continent: 'Europe', year: 2023, gdp: 1106 }, { country: 'Saudi Arabia', continent: 'Asia', year: 2020, gdp: 815 }, { country: 'Saudi Arabia', continent: 'Asia', year: 2021, gdp: 835 }, { country: 'Saudi Arabia', continent: 'Asia', year: 2022, gdp: 860 }, { country: 'Saudi Arabia', continent: 'Asia', year: 2023, gdp: 889 }, { country: 'Nigeria', continent: 'Africa', year: 2020, gdp: 504 }, { country: 'Nigeria', continent: 'Africa', year: 2021, gdp: 572 }, { country: 'Nigeria', continent: 'Africa', year: 2022, gdp: 649 }, { country: 'Nigeria', continent: 'Africa', year: 2023, gdp: 736 }, { country: 'Argentina', continent: 'South America', year: 2020, gdp: 444 }, { country: 'Argentina', continent: 'South America', year: 2021, gdp: 476 }, { country: 'Argentina', continent: 'South America', year: 2022, gdp: 508 }, { country: 'Argentina', continent: 'South America', year: 2023, gdp: 540 }, { country: 'South Africa', continent: 'South America', year: 2020, gdp: 403 }, { country: 'South Africa', continent: 'South America', year: 2021, gdp: 419 }, { country: 'South Africa', continent: 'South America', year: 2022, gdp: 438 }, { country: 'South Africa', continent: 'South America', year: 2023, gdp: 456 }, { country: 'Colombia', continent: 'South America', year: 2020, gdp: 367 }, { country: 'Colombia', continent: 'South America', year: 2021, gdp: 382 }, { country: 'Colombia', continent: 'South America', year: 2022, gdp: 400 }, { country: 'Colombia', continent: 'South America', year: 2023, gdp: 422 }, { country: 'Chile', continent: 'South America', year: 2020, gdp: 352 }, { country: 'Chile', continent: 'South America', year: 2021, gdp: 378 }, { country: 'Chile', continent: 'South America', year: 2022, gdp: 404 }, { country: 'Chile', continent: 'South America', year: 2023, gdp: 433 }, { country: 'Egypt', continent: 'Africa', year: 2020, gdp: 339 }, { country: 'Egypt', continent: 'Africa', year: 2021, gdp: 359 }, { country: 'Egypt', continent: 'Africa', year: 2022, gdp: 380 }, { country: 'Egypt', continent: 'Africa', year: 2023, gdp: 414 }, { country: 'Peru', continent: 'South America', year: 2020, gdp: 252 }, { country: 'Peru', continent: 'South America', year: 2021, gdp: 266 }, { country: 'Peru', continent: 'South America', year: 2022, gdp: 281 }, { country: 'Peru', continent: 'South America', year: 2023, gdp: 297 }, { country: 'New Zealand', continent: 'Oceania', year: 2020, gdp: 227 }, { country: 'New Zealand', continent: 'Oceania', year: 2021, gdp: 242 }, { country: 'New Zealand', continent: 'Oceania', year: 2022, gdp: 257 }, { country: 'New Zealand', continent: 'Oceania', year: 2023, gdp: 272 }, { country: 'Algeria', continent: 'Africa', year: 2020, gdp: 207 }, { country: 'Algeria', continent: 'Africa', year: 2021, gdp: 212 }, { country: 'Algeria', continent: 'Africa', year: 2022, gdp: 218 }, { country: 'Algeria', continent: 'Africa', year: 2023, gdp: 228 } ]; // return new core.CollectionView(data, { groupDescriptions: ['year', 'continent', 'country'] }); } // // get the group data for a selected point export function getGroupData(group) { // get items for this group, aggregate by sales let arr = []; // group.groups.forEach(g => { arr.push({ name: g.name, gdp: g.getAggregate(core.Aggregate.Sum, 'gdp'), group: g }); }); // // return a new collection view sorted by sales return new core.CollectionView(arr, { sortDescriptions: [ new core.SortDescription('gdp', false) ] }); }
body { margin-bottom: 24px; } .container h4 { text-align: center; } .container a { cursor: pointer; } .container .wj-flexchart { border: none; } .container { border: 1px solid #e4e4e4; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'jszip': 'npm:jszip/dist/jszip.js', '@mescius/wijmo': 'npm:@mescius/wijmo/index.js', '@mescius/wijmo.input': 'npm:@mescius/wijmo.input/index.js', '@mescius/wijmo.styles': 'npm:@mescius/wijmo.styles', '@mescius/wijmo.cultures': 'npm:@mescius/wijmo.cultures', '@mescius/wijmo.chart': 'npm:@mescius/wijmo.chart/index.js', '@mescius/wijmo.chart.analytics': 'npm:@mescius/wijmo.chart.analytics/index.js', '@mescius/wijmo.chart.animation': 'npm:@mescius/wijmo.chart.animation/index.js', '@mescius/wijmo.chart.annotation': 'npm:@mescius/wijmo.chart.annotation/index.js', '@mescius/wijmo.chart.finance': 'npm:@mescius/wijmo.chart.finance/index.js', '@mescius/wijmo.chart.finance.analytics': 'npm:@mescius/wijmo.chart.finance.analytics/index.js', '@mescius/wijmo.chart.hierarchical': 'npm:@mescius/wijmo.chart.hierarchical/index.js', '@mescius/wijmo.chart.interaction': 'npm:@mescius/wijmo.chart.interaction/index.js', '@mescius/wijmo.chart.radar': 'npm:@mescius/wijmo.chart.radar/index.js', '@mescius/wijmo.chart.render': 'npm:@mescius/wijmo.chart.render/index.js', '@mescius/wijmo.chart.webgl': 'npm:@mescius/wijmo.chart.webgl/index.js', '@mescius/wijmo.chart.map': 'npm:@mescius/wijmo.chart.map/index.js', '@mescius/wijmo.gauge': 'npm:@mescius/wijmo.gauge/index.js', '@mescius/wijmo.grid': 'npm:@mescius/wijmo.grid/index.js', '@mescius/wijmo.grid.detail': 'npm:@mescius/wijmo.grid.detail/index.js', '@mescius/wijmo.grid.filter': 'npm:@mescius/wijmo.grid.filter/index.js', '@mescius/wijmo.grid.search': 'npm:@mescius/wijmo.grid.search/index.js', '@mescius/wijmo.grid.grouppanel': 'npm:@mescius/wijmo.grid.grouppanel/index.js', '@mescius/wijmo.grid.multirow': 'npm:@mescius/wijmo.grid.multirow/index.js', '@mescius/wijmo.grid.transposed': 'npm:@mescius/wijmo.grid.transposed/index.js', '@mescius/wijmo.grid.transposedmultirow': 'npm:@mescius/wijmo.grid.transposedmultirow/index.js', '@mescius/wijmo.grid.pdf': 'npm:@mescius/wijmo.grid.pdf/index.js', '@mescius/wijmo.grid.sheet': 'npm:@mescius/wijmo.grid.sheet/index.js', '@mescius/wijmo.grid.xlsx': 'npm:@mescius/wijmo.grid.xlsx/index.js', '@mescius/wijmo.grid.selector': 'npm:@mescius/wijmo.grid.selector/index.js', '@mescius/wijmo.grid.cellmaker': 'npm:@mescius/wijmo.grid.cellmaker/index.js', '@mescius/wijmo.nav': 'npm:@mescius/wijmo.nav/index.js', '@mescius/wijmo.odata': 'npm:@mescius/wijmo.odata/index.js', '@mescius/wijmo.olap': 'npm:@mescius/wijmo.olap/index.js', '@mescius/wijmo.rest': 'npm:@mescius/wijmo.rest/index.js', '@mescius/wijmo.pdf': 'npm:@mescius/wijmo.pdf/index.js', '@mescius/wijmo.pdf.security': 'npm:@mescius/wijmo.pdf.security/index.js', '@mescius/wijmo.viewer': 'npm:@mescius/wijmo.viewer/index.js', '@mescius/wijmo.xlsx': 'npm:@mescius/wijmo.xlsx/index.js', '@mescius/wijmo.undo': 'npm:@mescius/wijmo.undo/index.js', '@mescius/wijmo.interop.grid': 'npm:@mescius/wijmo.interop.grid/index.js', '@mescius/wijmo.touch': 'npm:@mescius/wijmo.touch/index.js', '@mescius/wijmo.cloud': 'npm:@mescius/wijmo.cloud/index.js', '@mescius/wijmo.barcode': 'npm:@mescius/wijmo.barcode/index.js', '@mescius/wijmo.barcode.common': 'npm:@mescius/wijmo.barcode.common/index.js', '@mescius/wijmo.barcode.composite': 'npm:@mescius/wijmo.barcode.composite/index.js', '@mescius/wijmo.barcode.specialized': 'npm:@mescius/wijmo.barcode.specialized/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'bootstrap.css': 'npm:bootstrap/dist/css/bootstrap.min.css', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);