Axis Groups

FlexChart's axis supports groups defined in CollectionView which specified as chart's data source. To display group you need to create groups in collection view and set axis.groupsOptions property. E.g. chart.axisX.groupsOptions = { display : AxisGroupsDisplay.Show }

Learn about FlexChart | FlexChart API Reference

import "bootstrap.css"; import "@mescius/wijmo.styles/wijmo.css"; import "./styles.css"; import { CollectionView, SortDescription, PropertyGroupDescription } from "@mescius/wijmo"; import { Menu } from "@mescius/wijmo.input"; import { FlexChart, ChartType, Position, AxisGroupsDisplay } from "@mescius/wijmo.chart"; import { getData } from "./data"; document.readyState === "complete" ? init() : (window.onload = init); function init() { // create view with groups let view = new CollectionView(getData(), { sortDescriptions: [new SortDescription("sales", false)], groupDescriptions: [ new PropertyGroupDescription("category"), new PropertyGroupDescription("subCategory"), ], }); // const chart = new FlexChart("#theChart", { chartType: "Column", itemsSource: view, bindingX: "product", series: [{ binding: "sales", name: "Sales" }], axisX: { labelAngle: -90 }, legend: { position: "None" }, header: 'Sales By Category' }); // new Menu("#groups", { textChanged: function (s) { chart.axisX.groupsOptions = chart.axisY.groupsOptions = { display: AxisGroupsDisplay[s.text], }; s.header = `Groups: <b>${s.selectedItem}</b>`; }, itemsSource: "Show,ShowGrid,None".split(","), }); // new Menu("#axis", { textChanged: function (s) { const position = Position[s.text]; s.header = `Position: <b>${s.selectedItem}</b>`; const isBar = position === Position.Left || position === Position.Right; // 'rotate' chart according to the position chart.chartType = isBar ? ChartType.Bar : ChartType.Column; chart.axisX.labelAngle = isBar ? 0 : -90; chart.axisX.majorGrid = isBar; chart.axisX.position = isBar ? Position.Auto : position; chart.axisY.majorGrid = !isBar; chart.axisY.position = isBar ? position : Position.Auto; }, itemsSource: "Bottom,Top,Left,Right".split(","), }); }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>MESCIUS Wijmo FlexChart Axis Groups</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"> <div> <div id="groups"></div> <div id="axis"></div> </div> <div id="theChart"></div> </div> </body> </html>
export function getData() { const categories = [ 'Electronics', 'Computers & Tablets' ]; const subCategories = [ ['Camera', 'Headphones', 'Cell Phones'], ['Desktops', 'Laptops', 'Tablets'] ]; const products = [ [ ['Digital', 'Film', 'Lenses', 'Video', 'Accessories'], ['Earbud', 'Over-ear', 'On-ear', 'Bluetooth', 'Noise-cancelling', 'Audiophile headphones'], ['Cell Phones', 'Accessories'], ], [ ['All-in-ones', 'Minis', 'Towers'], ['2 in 1', 'Traditional'], ['iOS', 'Android', 'Windows'] ] ]; let data = []; for (let i = 0; i < categories.length; i++) { for (let j = 0; j < subCategories[i].length; j++) { for (let k = 0; k < products[i][j].length; k++) { data.push({ id: i, category: categories[i], subCategory: subCategories[i][j], product: products[i][j][k], sales: Math.random() * 100, }); } } } // return data; }
.wj-flexchart .wj-axis-x .wj-label, .wj-flexchart .wj-axis-y .wj-label{ font-size: small; } .wj-menu { margin: 4px 4px 4px 0; } .wj-control.wj-flexchart { height: 480px; } body { margin-bottom: 24pt; }
(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.style': 'npm:@mescius/wijmo.grid.style/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);