チャート:ドリルダウン

FlexChartは、ドリルダウンチャートの実装をサポートします。 この縦棒グラフは、FlexChartのselectionChangedイベントを使用して、ユーザーがクリックした列を判別し、グラフのitemsSource を新しいデータで更新し、グラフの色を変更して新しいデータが表示されていることを示します。

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: '年', format: 'd' }, axisY: { title: 'GDP(10億ドル)' }, 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 = { country: '国', continent: '大陸', year: '年' }[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: { country: '国', continent: '大陸', year: '年' }[prop], value: item[prop] }); // headers.push(hdr); path += '/' + item[prop]; } // header.innerHTML = headers.length > 0 ? '名目GDP(IMF推定) - ' + headers.join('、') : '名目GDP(IMF推定)'; } // // 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">名目GDP(IMF推定)</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: 'アメリカ', continent: '北アメリカ', year: 2020, gdp: 22289 }, { country: 'アメリカ', continent: '北アメリカ', year: 2021, gdp: 23096 }, { country: 'アメリカ', continent: '北アメリカ', year: 2022, gdp: 23874 }, { country: 'アメリカ', continent: '北アメリカ', year: 2023, gdp: 24670 }, { country: '中国', continent: 'アジア', year: 2020, gdp: 15461 }, { country: '中国', continent: 'アジア', year: 2021, gdp: 16768 }, { country: '中国', continent: 'アジア', year: 2022, gdp: 18131 }, { country: '中国', continent: 'アジア', year: 2023, gdp: 19580 }, { country: '日本', continent: 'アジア', year: 2020, gdp: 5371 }, { country: '日本', continent: 'アジア', year: 2021, gdp: 5522 }, { country: '日本', continent: 'アジア', year: 2022, gdp: 5714 }, { country: '日本', continent: 'アジア', year: 2023, gdp: 5907 }, { country: 'ドイツ', continent: 'ヨーロッパ', year: 2020, gdp: 4331 }, { country: 'ドイツ', continent: 'ヨーロッパ', year: 2021, gdp: 4523 }, { country: 'ドイツ', continent: 'ヨーロッパ', year: 2022, gdp: 4736 }, { country: 'ドイツ', continent: 'ヨーロッパ', year: 2023, gdp: 4937 }, { country: 'インド', continent: 'アジア', year: 2020, gdp: 3258 }, { country: 'インド', continent: 'アジア', year: 2021, gdp: 3586 }, { country: 'インド', continent: 'アジア', year: 2022, gdp: 3941 }, { country: 'インド', continent: 'アジア', year: 2023, gdp: 4329 }, { country: 'フランス', continent: 'ヨーロッパ', year: 2020, gdp: 2979 }, { country: 'フランス', continent: 'ヨーロッパ', year: 2021, gdp: 3100 }, { country: 'フランス', continent: 'ヨーロッパ', year: 2022, gdp: 3234 }, { country: 'フランス', continent: 'ヨーロッパ', year: 2023, gdp: 3363 }, { country: 'イギリス', continent: 'ヨーロッパ', year: 2020, gdp: 2912 }, { country: 'イギリス', continent: 'ヨーロッパ', year: 2021, gdp: 3012 }, { country: 'イギリス', continent: 'ヨーロッパ', year: 2022, gdp: 3135 }, { country: 'イギリス', continent: 'ヨーロッパ', year: 2023, gdp: 3257 }, { country: 'イタリア', continent: 'ヨーロッパ', year: 2020, gdp: 2191 }, { country: 'イタリア', continent: 'ヨーロッパ', year: 2021, gdp: 2255 }, { country: 'イタリア', continent: 'ヨーロッパ', year: 2022, gdp: 2329 }, { country: 'イタリア', continent: 'ヨーロッパ', year: 2023, gdp: 2395 }, { country: 'ブラジル', continent: '南アメリカ', year: 2020, gdp: 2027 }, { country: 'ブラジル', continent: '南アメリカ', year: 2021, gdp: 2129 }, { country: 'ブラジル', continent: '南アメリカ', year: 2022, gdp: 2237 }, { country: 'ブラジル', continent: '南アメリカ', year: 2023, gdp: 2351 }, { country: 'カナダ', continent: '北アメリカ', year: 2020, gdp: 1937 }, { country: 'カナダ', continent: '北アメリカ', year: 2021, gdp: 2053 }, { country: 'カナダ', continent: '北アメリカ', year: 2022, gdp: 2185 }, { country: 'カナダ', continent: '北アメリカ', year: 2023, gdp: 2321 }, { country: '韓国', continent: 'アジア', year: 2020, gdp: 1781 }, { country: '韓国', continent: 'アジア', year: 2021, gdp: 1864 }, { country: '韓国', continent: 'アジア', year: 2022, gdp: 1959 }, { country: '韓国', continent: 'アジア', year: 2023, gdp: 2054 }, { country: 'ロシア', continent: 'ヨーロッパ', year: 2020, gdp: 1683 }, { country: 'ロシア', continent: 'ヨーロッパ', year: 2021, gdp: 1719 }, { country: 'ロシア', continent: 'ヨーロッパ', year: 2022, gdp: 1757 }, { country: 'ロシア', continent: 'ヨーロッパ', year: 2023, gdp: 1818 }, { country: 'スペイン', continent: 'ヨーロッパ', year: 2020, gdp: 1550 }, { country: 'スペイン', continent: 'ヨーロッパ', year: 2021, gdp: 1616 }, { country: 'スペイン', continent: 'ヨーロッパ', year: 2022, gdp: 1690 }, { country: 'スペイン', continent: 'ヨーロッパ', year: 2023, gdp: 1758 }, { country: 'オーストラリア', continent: 'オセアニア', year: 2020, gdp: 1541 }, { country: 'オーストラリア', continent: 'オセアニア', year: 2021, gdp: 1615 }, { country: 'オーストラリア', continent: 'オセアニア', year: 2022, gdp: 1700 }, { country: 'オーストラリア', continent: 'オセアニア', year: 2023, gdp: 1794 }, { country: 'メキシコ', continent: '北アメリカ', year: 2020, gdp: 1306 }, { country: 'メキシコ', continent: '北アメリカ', year: 2021, gdp: 1376 }, { country: 'メキシコ', continent: '北アメリカ', year: 2022, gdp: 1449 }, { country: 'メキシコ', continent: '北アメリカ', year: 2023, gdp: 1526 }, { country: 'インドネシア', continent: 'アジア', year: 2020, gdp: 1175 }, { country: 'インドネシア', continent: 'アジア', year: 2021, gdp: 1259 }, { country: 'インドネシア', continent: 'アジア', year: 2022, gdp: 1349 }, { country: 'インドネシア', continent: 'アジア', year: 2023, gdp: 1446 }, { country: 'オランダ', continent: 'ヨーロッパ', year: 2020, gdp: 980 }, { country: 'オランダ', continent: 'ヨーロッパ', year: 2021, gdp: 1021 }, { country: 'オランダ', continent: 'ヨーロッパ', year: 2022, gdp: 1065 }, { country: 'オランダ', continent: 'ヨーロッパ', year: 2023, gdp: 1106 }, { country: 'サウジアラビア', continent: 'アジア', year: 2020, gdp: 815 }, { country: 'サウジアラビア', continent: 'アジア', year: 2021, gdp: 835 }, { country: 'サウジアラビア', continent: 'アジア', year: 2022, gdp: 860 }, { country: 'サウジアラビア', continent: 'アジア', year: 2023, gdp: 889 }, { country: 'ナイジェリア', continent: 'アフリカ', year: 2020, gdp: 504 }, { country: 'ナイジェリア', continent: 'アフリカ', year: 2021, gdp: 572 }, { country: 'ナイジェリア', continent: 'アフリカ', year: 2022, gdp: 649 }, { country: 'ナイジェリア', continent: 'アフリカ', year: 2023, gdp: 736 }, { country: 'アルゼンチン', continent: '南アメリカ', year: 2020, gdp: 444 }, { country: 'アルゼンチン', continent: '南アメリカ', year: 2021, gdp: 476 }, { country: 'アルゼンチン', continent: '南アメリカ', year: 2022, gdp: 508 }, { country: 'アルゼンチン', continent: '南アメリカ', year: 2023, gdp: 540 }, { country: '南アフリカ', continent: '南アメリカ', year: 2020, gdp: 403 }, { country: '南アフリカ', continent: '南アメリカ', year: 2021, gdp: 419 }, { country: '南アフリカ', continent: '南アメリカ', year: 2022, gdp: 438 }, { country: '南アフリカ', continent: '南アメリカ', year: 2023, gdp: 456 }, { country: 'コロンビア', continent: '南アメリカ', year: 2020, gdp: 367 }, { country: 'コロンビア', continent: '南アメリカ', year: 2021, gdp: 382 }, { country: 'コロンビア', continent: '南アメリカ', year: 2022, gdp: 400 }, { country: 'コロンビア', continent: '南アメリカ', year: 2023, gdp: 422 }, { country: 'チリ', continent: '南アメリカ', year: 2020, gdp: 352 }, { country: 'チリ', continent: '南アメリカ', year: 2021, gdp: 378 }, { country: 'チリ', continent: '南アメリカ', year: 2022, gdp: 404 }, { country: 'チリ', continent: '南アメリカ', year: 2023, gdp: 433 }, { country: 'エジプト', continent: 'アフリカ', year: 2020, gdp: 339 }, { country: 'エジプト', continent: 'アフリカ', year: 2021, gdp: 359 }, { country: 'エジプト', continent: 'アフリカ', year: 2022, gdp: 380 }, { country: 'エジプト', continent: 'アフリカ', year: 2023, gdp: 414 }, { country: 'ペルー', continent: '南アメリカ', year: 2020, gdp: 252 }, { country: 'ペルー', continent: '南アメリカ', year: 2021, gdp: 266 }, { country: 'ペルー', continent: '南アメリカ', year: 2022, gdp: 281 }, { country: 'ペルー', continent: '南アメリカ', year: 2023, gdp: 297 }, { country: 'ニュージーランド', continent: 'オセアニア', year: 2020, gdp: 227 }, { country: 'ニュージーランド', continent: 'オセアニア', year: 2021, gdp: 242 }, { country: 'ニュージーランド', continent: 'オセアニア', year: 2022, gdp: 257 }, { country: 'ニュージーランド', continent: 'オセアニア', year: 2023, gdp: 272 }, { country: 'アルジェリア', continent: 'アフリカ', year: 2020, gdp: 207 }, { country: 'アルジェリア', continent: 'アフリカ', year: 2021, gdp: 212 }, { country: 'アルジェリア', continent: 'アフリカ', year: 2022, gdp: 218 }, { country: 'アルジェリア', continent: 'アフリカ', 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);