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

The demo is being dynamically compiled to support real-time code editing... For quicker access to features, switch to the "JavaScript" tab for a smoother experience! :)
app.js
index.html
data.js
styles.css
Copy to CodeMine
loading...
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(","), }); }
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);