This tutorial shows how to integrate Flexmonster with amCharts — a JavaScript library for interactive data visualization. Flexmonster supports amCharts 5 and amCharts 4.
Watch the tutorial in the video format: Pivot table with amCharts.
Flexmonster supports all chart types available in amCharts 5 and amCharts 4.
Visit the Examples page for ready-to-use examples of integration with different chart types.
The steps below describe how to create a pie chart based on data received from the component. To integrate Flexmonster with other chart types, refer to the amCharts documentation.
Add Flexmonster to your webpage and configure a simple report (e.g., based on a JSON or CSV data source). Replace "XXXX-XXXX-XXXX-XXXX-XXXX"
with your license key. If you don’t have a license key, contact our team and request a special trial key.
<div id="pivotContainer">The component will appear here</div> <script src="https://cdn.flexmonster.com/flexmonster.js"></script> <script> const pivot = new Flexmonster({ container: "pivotContainer", componentFolder: "https://cdn.flexmonster.com/", report: { dataSource: { filename: "data/data.csv" }, slice: { rows: [ { uniqueName: "Country" } ], columns: [ { uniqueName: "Color" }, { uniqueName: "[Measures]" } ], measures: [ { uniqueName: "Price" } ] } }, licenseKey: "XXXX-XXXX-XXXX-XXXX-XXXX" }); </script>
Include the amCharts files to your webpage:
<script src="https://cdn.amcharts.com/lib/5/index.js"></script> <script src="https://cdn.amcharts.com/lib/5/percent.js"></script>
Including files directly to the webpage is one of the possible ways to add amCharts. Refer to the amCharts installation guide for other ways of adding amCharts 5.
<script src="https://cdn.amcharts.com/lib/4/core.js"></script> <script src="https://cdn.amcharts.com/lib/4/charts.js"></script>
Including files directly to the webpage is one of the possible ways to add amCharts. Refer to the amCharts installation guide for other ways of adding amCharts 4.
Flexmonster Connector for amCharts provides ready-to-use methods for easy and smooth integration with amCharts. Add it to your webpage with the following line of code:
<script src="https://cdn.flexmonster.com/lib/flexmonster.amcharts.js"></script>
Add a container for the chart:
<div id="chartContainer"></div>
Note If you are integrating with amCharts 5, explicitly set the height for your container in CSS styles. Otherwise, the created chart will not be visible.
A chart should be created only when the component is ready to provide the data. To track this, use the reportcomplete event:
const pivot = new Flexmonster({ container: "pivotContainer", componentFolder: "https://cdn.flexmonster.com/", report: { // Report from the 1st step }, licenseKey: "XXXX-XXXX-XXXX-XXXX-XXXX", reportcomplete: function() { pivot.off("reportcomplete"); createChart(); } });
When data loading is complete, the event handler will invoke the createChart()
function to draw the chart. The implementation of the createChart()
function is given below.
The Connector for amCharts provides the amcharts.getData() method, which requests data from the component and returns it as an array of objects. Call the amcharts.getData()
method to get data from the component:
function createChart() { pivot.amcharts.getData({}, drawChart, updateChart); }
Data returned by the amcharts.getData()
method contains fields specified in the report.slice
object. If the amcharts.getData()
method gets a slice as a parameter, the data is prepared according to it.
Declare a global variable that will be used to draw and update the chart:
In amCharts 5, charts should be created in a root element. Create the root element in the container we have added in step 4:
const root = am5.Root.new("chartContainer");
Create an empty variable:
let chart;
It will be initialized later in the function that draws the chart.
The drawChart()
function initializes the chart, configures it, and fills the chart with data provided by the amcharts.getData() method:
function drawChart(chartConfig, rawData) { // Create the chart let chart = root.container.children.push( am5percent.PieChart.new(root, {}) ); // Create and configure pie series let series = chart.series.push( am5percent.PieSeries.new(root, { valueField: pivot.amcharts.getMeasureNameByIndex(rawData, 0), categoryField: pivot.amcharts.getCategoryName(rawData), }) ); series.slices.template.setAll({ stroke: am5.color("#fff"), strokeWidth: 2, }); series.labels.template.setAll({ fontSize: 12 }); // Fill the chart with the data from Flexmonster series.data.setAll(chartConfig.data); }
Notice the following lines in the code snippet:
am5percent.PieSeries.new(root, { categoryField: pivot.amcharts.getCategoryName(rawData), valueField: pivot.amcharts.getMeasureNameByIndex(rawData, 0), });
The amcharts.getCategoryName() method is used to set the categoryField
for the pie series. Learn more about how the method chooses the category.
Then, amcharts.getMeasureNameByIndex() sets the valueField
.
For more details on how the pie chart is created, see the amCharts documentation.
function drawChart(chartData, rawData) { // Initialize the chart chart = am4core.create("chartContainer", am4charts.PieChart); // Fill the chart with the data from Flexmonster chart.data = chartData.data; // Create and configure pie series let series = chart.series.push(new am4charts.PieSeries()); series.dataFields.category = pivot.amcharts.getCategoryName(rawData); series.dataFields.value = pivot.amcharts.getMeasureNameByIndex(rawData, 0); series.slices.template.stroke = am4core.color("#fff"); series.slices.template.strokeWidth = 2; series.labels.template.fontSize = 12; }
Notice the following lines in the code snippet:
series.dataFields.category = pivot.amcharts.getCategoryName(rawData); series.dataFields.value = pivot.amcharts.getMeasureNameByIndex(rawData, 0);
The amcharts.getCategoryName() method is used to set the category name for the amCharts Category axis. Learn more about how the method chooses the category name.
Then, amcharts.getMeasureNameByIndex() sets the value for the Value axis.
For more details on how the pie chart is created, see the amCharts documentation.
Create a function that will redraw the chart once the report is updated (e.g., when the data is filtered, sorted, etc.):
function updateChart(chartConfig, rawData) { root.container.children.clear(); drawChart(chartConfig, rawData); }
function updateChart(chartConfig, rawData) { chart.dispose(); drawChart(chartConfig, rawData); }
When the data is updated, this function will redraw the chart based on the updated data.
Launch your webpage from a browser and see an interactive pie chart displaying data from the component. Check out a live example on JSFiddle:
You can also watch our video tutorial that covers the integration process:
This section explains how Flexmonster Connector for amCharts preprocesses data for the chart.
The amcharts.getData() method returns data as a JSON array of objects:
[ { "categoryName": "value", "measureName 1": "value", … "measureName n": "value", } … ]
Each object in the array contains only one category field as well as all the measures from the slice.
A field to represent the category is chosen as follows:
slice.rows
array is empty and the slice.columns array contains some fields, the first field from columns is chosen as the category.If both slice.rows
and slice.columns
are empty, then no category is available, and amcharts.getCategoryName() will return undefined
.
In such cases, the amcharts.getMeasureNameByIndex() method can be used to select the category for the series.
flexmonster.amcharts.js
is a connector between the Flexmonster component and amCharts. Learn more about the Connector’s API.
The Connector provides the amcharts.getNumberFormatPattern() method, which converts the FormatObject to the amCharts number formatting string (in the format "<positive format>|<negative format>"
, for example "'$'#,###|'($'#,###s')'"
). The amcharts.getNumberFormatPattern()
method considers the following FormatObject properties:
decimalPlaces
maxDecimalPlaces
negativeNumberFormat
(only the -1
and (1)
formats are available)currencySymbol
positiveCurrencyFormat
negativeCurrencyFormat
(only the $-1
, -1$
, ($1)
, and (1$)
formats are available)isPercent
Regardless of the FormatObject configuration, the following properties have constant values in amCharts:
thousandsSeparator
: ","
decimalSeparator
: "."
amCharts imposes this limitation because it uses predefined separators for decimals and thousands.
Number formatting can be applied to both amCharts 5 and amCharts 4:
root = am5.Root.new("amcharts-container"); // Convert the Flexmonster number format to a format required by amCharts // In this example, the numberFormat will be "'$'#,###|'($'#,###s')'" let numberFormat = pivot.amcharts.getNumberFormatPattern(rawData.meta.formats[0]); // Apply the number format to amCharts root.numberFormatter.set("numberFormat", numberFormat);
Learn more about number formatting in amCharts 5.
let valueAxis = chart.yAxes.push(new am4charts.ValueAxis()); // Convert the Flexmonster number format to a format required by amCharts // In this example, the numberFormat will be "'$'#,###|'($'#,###s')'" let numberFormat = pivot.amcharts.getNumberFormatPattern(rawData.meta.formats[0]); // Apply the number format to the chart's axis valueAxis.numberFormatter = new am4core.NumberFormatter(); valueAxis.numberFormatter.numberFormat = numberFormat;
Learn more about number formatting in amCharts 4.