Using amCharts 5 with Angular

This page is a work in progress. Please bear with us while we're working on this content.

This tutorial will provide basic information, needed to run amCharts 5 with Angular framework.

Requirements

amCharts 5 requires TypeScript 4.3 or later to run. This in turn means that it will run on Angular 12 or later.

For running amCharts in lower versions of Angular than 12, see "Before Angular 12" section.

Using amCharts

First, create a new Angular project:

npx -p @angular/cli ng new my-project
cd my-project

Edit the package.json and add --prod --build-optimizer=false to the "build" script:

"scripts": {
  ...
  "build": "ng build --prod",
  ...
},

You can now run your project by using this command:

npm start

If you load http://localhost:4200/ in a browser, you should see your new project!

Now it's time to add in an amCharts 5 chart. First create a new chart component:

npm run -- ng generate component chart --module app

Then use this command to install amCharts 4:

npm install @amcharts/amcharts5

Then add in the following code to the src/app/chart/chart.component.html file:

<div id="chartdiv" style="width: 100%; height: 500px"></div>

And use the following code in src/app/chart/chart.component.ts:

import { Component, Inject, NgZone, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';

// amCharts imports
import * as am5 from '@amcharts/amcharts5';
import * as am5xy from '@amcharts/amcharts5/xy';
import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';

@Component({
  selector: 'app-chart',
  templateUrl: './chart.component.html',
  styleUrls: ['./chart.component.css']
})

export class ChartComponent {
  private root: am5.Root;

  constructor(@Inject(PLATFORM_ID) private platformId, private zone: NgZone) {}

  // Run the function only in the browser
  browserOnly(f: () => void) {
    if (isPlatformBrowser(this.platformId)) {
      this.zone.runOutsideAngular(() => {
        f();
      });
    }
  }

  ngAfterViewInit() {
    // Chart code goes in here
    this.browserOnly(() => {
      let root = am5.Root.new("chartdiv");

      root.setThemes([am5themes_Animated.new(root)]);

      let chart = root.container.children.push(
        am5xy.XYChart.new(root, {
          panY: false,
          layout: root.verticalLayout
        })
      );

      // Define data
      let data = [
        {
          category: "Research",
          value1: 1000,
          value2: 588
        },
        {
          category: "Marketing",
          value1: 1200,
          value2: 1800
        },
        {
          category: "Sales",
          value1: 850,
          value2: 1230
        }
      ];

      // Create Y-axis
      let yAxis = chart.yAxes.push(
        am5xy.ValueAxis.new(root, {
          renderer: am5xy.AxisRendererY.new(root, {})
        })
      );

      // Create X-Axis
      let xAxis = chart.xAxes.push(
        am5xy.CategoryAxis.new(root, {
          renderer: am5xy.AxisRendererX.new(root, {}),
          categoryField: "category"
        })
      );
      xAxis.data.setAll(data);

      // Create series
      let series1 = chart.series.push(
        am5xy.ColumnSeries.new(root, {
          name: "Series",
          xAxis: xAxis,
          yAxis: yAxis,
          valueYField: "value1",
          categoryXField: "category"
        })
      );
      series1.data.setAll(data);

      let series2 = chart.series.push(
        am5xy.ColumnSeries.new(root, {
          name: "Series",
          xAxis: xAxis,
          yAxis: yAxis,
          valueYField: "value2",
          categoryXField: "category"
        })
      );
      series2.data.setAll(data);

      // Add legend
      let legend = chart.children.push(am5.Legend.new(root, {}));
      legend.data.setAll(chart.series.values);

      // Add cursor
      chart.set("cursor", am5xy.XYCursor.new(root, {}));

      this.root = root;
    });
  }

  ngOnDestroy() {
    // Clean up chart when the component is removed
    this.browserOnly(() => {
      if (this.root) {
        this.root.dispose();
      }
    });
  }
}

The chart code goes inside the ngAfterViewInit method.

Lastly, add <app-chart></app-chart> to your src/app.component.html file.

Now you can run npm start again and you should see a chart.

Working example

Lazy loading amCharts

Pardon the mess. We're still working on this section.

Before Angular 12

If your app is using Angular version lower than 12, you will need to use script version of amCharts 5.

Instead of importing amCharts 5 modules, add them as a <scr1ipt> blocks in HTML.

<script src="https://cdn.amcharts.com/lib/5/index.js"></script>
<script src="https://cdn.amcharts.com/lib/5/xy.js"></script>
<script src="https://cdn.amcharts.com/lib/5/themes/Animated.js"></script>

As well as declare amCharts globals that are created by scripts:

declare const am5: any;
declare const am5xy: any;
declare const am5themes_Animated: any;